在rx中有一个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;
}
您提出的代码有一个普遍的问题,即它在操作底层流时修改了底层流。这与流不受干扰的一般要求相冲突,并且通常在实践中意味着当使用流管道与容器一起删除底层容器中的对象时,您将获得ConcurrentModificationException
。
在任何情况下(正如我昨天学到的),Collection
类上有一个新的默认方法,它几乎完全是你想要的:
private static boolean isItemInDataThenRemove(Map<String, Object> data, String removeKey) {
return data.entrySet().removeIf(entry -> entry.getKey().equalsIgnoreCase(removeKey));
}
WORKING CODE:
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;
}