NPE while filter list with io.reactivex.Observable
Clash Royale CLAN TAG#URR8PPP
NPE while filter list with io.reactivex.Observable
I facing with problem while try to filter ArrayList
of String
as Observable
.
ArrayList
String
Observable
All works fine if:
MatrixCursor suggestionsCursor =
new MatrixCursor(new StringBaseColumns._ID, COLUMN_FIELD_NO);
for (int i = 0; i < data.size(); i++)
if (data.get(i) != null)
if (data.get(i).toLowerCase().contains(newText.toLowerCase()))
filtered.add(data.get(i));
int key = 0;
for (String suggestion : filtered)
suggestionsCursor.addRow(new Objectkey++, suggestion);
But not if
MatrixCursor suggestionsCursor =
new MatrixCursor(new StringBaseColumns._ID, COLUMN_FIELD_NO);
Observable.fromIterable(data)
.filter(it->it!=null && it.toLowerCase().contains(newText.toLowerCase()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.toList()
.subscribe(strings ->
int key = 0;
for (String suggestion : strings)
suggestionsCursor.addRow(new Objectkey++, suggestion);
);
Because I get an error
io.reactivex.exceptions.OnErrorNotImplementedException: The iterator
returned a null value
Where am I wrong here?
@Anton feel free to accept one of the answers below if you think it is appropriate
– Lino
Aug 12 at 10:35
3 Answers
3
As mentioned in the comment, null
values in the iterable sequence are not supported. This check is enforced in the ObservableFromIterable.java
class:
null
ObservableFromIterable.java
v = ObjectHelper.requireNonNull(it.next(), "The iterator returned a null value");
This also means that a filter like this does not help
.filter(it -> it != null)
In any case, a good rule of thumb will be to handle error exceptions
Observable.fromIterable(data)
.filter(it->it!=null && it.toLowerCase().contains(newText.toLowerCase()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.toList()
.subscribe(strings ->
int key = 0;
for (String suggestion : strings)
suggestionsCursor.addRow(new Objectkey++, suggestion);
, error ->
/* handle exceptions here */
);
You could use the Iterable Extensions library (IxJava) for preprocessing, which let's you work with null
s:
null
Observable.fromIterable(
Ix.from(data)
.filter(it -> it != null
&& it.toLowerCase().contains(newText.toLowerCase())
)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.toList()
.subscribe(strings ->
int key = 0;
for (String suggestion : strings)
suggestionsCursor.addRow(new Objectkey++, suggestion);
,
Throwable::printStackTrace);
Both answears are good, but I found easier solution.
data.removeAll(Collections.singleton(null));
After populate data with Strings
Strings
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Trying to work with a sequence containing nulls. Nulls are not allowed and not accepted in a flow and filter would never receive a null item. You have to pre-filter the iterable and remove nulls before it is handed to RxJava.
– akarnokd
Aug 10 at 10:16