1

我在 rx.Observable 中有一个 java.util.Map,我想过滤地图(根据给定的键删除一个元素)。

我当前的代码是命令式和函数式的混合体,我想在不调用isItemInDataThenRemove.

public static Observable<Map<String, Object>> filter(Map<String, Object> data, String removeKey) {
    return Observable.from(data).filter((entry) -> isItemInDataThenRemove(entry,removeKey));
}

private static boolean isItemInDataThenRemove(Map<String, Object> data, String removeKey) {
    for (Map.Entry<String,Object> entry : data.entrySet()) {
        if(entry.getKey().equalsIgnoreCase(removeKey)) {
            System.out.printf("Found element %s, removing.", removeKey);
            data.remove(removeKey);
            return true;
        }
    }
    return false;
}
4

2 回答 2

2

您提出的代码存在一个普遍问题,即它在对其进行操作时会修改底层流。这与不干扰流的一般要求相冲突,并且通常在实践中意味着当您将ConcurrentModificationException流管道与删除底层容器中对象的容器一起使用时,您会得到一个。

在任何情况下(正如我昨天了解到的),类中有一个新的默认方法Collection,它几乎完全符合您的要求:

private static boolean isItemInDataThenRemove(Map<String, Object> data, String removeKey) {
    return data.entrySet().removeIf(entry -> entry.getKey().equalsIgnoreCase(removeKey));
}
于 2014-07-23T22:42:07.220 回答
0

工作代码:

private static boolean isItemInDataThenRemove(Map<String, Object> data, String removeKey) {
    data.entrySet().stream().filter(entry ->
            entry.getKey().equalsIgnoreCase(removeKey)).forEach(entry -> {
        data.remove(entry.getKey());
    });
    return true;
}
于 2014-07-23T19:53:53.913 回答