我在尝试将ArrayList
的{{1}}过滤为String
时遇到问题。
在以下情况下一切正常:
Observable
但不是
MatrixCursor suggestionsCursor =
new MatrixCursor(new String[]{BaseColumns._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 Object[]{key++, suggestion});
}
因为出现错误
io.reactivex.exceptions.OnErrorNotImplementedException:迭代器 返回空值
我在哪里错了?
答案 0 :(得分:1)
如注释中所述,不支持可迭代序列中的2
值。此检查在null
类中执行:
ObservableFromIterable.java
这也意味着像这样的过滤器无济于事
v = ObjectHelper.requireNonNull(it.next(), "The iterator returned a null value");
无论如何,一个好的经验法则是处理错误异常
.filter(it -> it != null)
答案 1 :(得分:1)
您可以使用Iterable Extensions库(IxJava)进行预处理,让您可以使用null
s:
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 Object[]{key++, suggestion});
}
},
Throwable::printStackTrace);
答案 2 :(得分:0)
两个人都很好,但是我找到了更简单的解决方法。
data.removeAll(Collections.singleton(null));
用Strings
填充数据后