使用io.reactivex.Observable

时间:2018-08-10 09:41:54

标签: android iterator rx-java2 rx-android

我在尝试将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:迭代器   返回空值

我在哪里错了?

3 个答案:

答案 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填充数据后