Java 8 Streams - Iterator根据条件映射和删除

Tao*_*itz 10 java java-8 java-stream

我试图弄清楚如何重写这个以使用流和过滤器来缩小我的标准并在必要时从地图中删除.

Iterator<Map.Entry<String,Object>> iter = listOfPossibleParams.entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry<String,Object> entry = iter.next();
    if(entry.getValue() instanceof String) {
        if (StringUtils.isBlank((String) entry.getValue())) {
            iter.remove();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我最初在想这样的事情,但它显然不起作为语法错误:

listOfPossibleParams.entrySet()
            .stream()
            .filter(p -> p.getValue() instanceof String)
            .removeIf(e -> StringUtils.isBlank((String)e.getValue()));
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 15

如果您可以修改Map,那么您可以:

listOfPossibleParams.values()
                    .removeIf(v -> v instanceof String && StringUtils.isBlank((String) v));
Run Code Online (Sandbox Code Playgroud)

如果你想建立一个新的地图,你可以:

listOfPossibleParams.entrySet()
                    .stream()
                    .filter(p -> {
                        Object v = p.getValue();
                        return !(v instanceof String) || !StringUtils.isBlank((String) v);
                    })
                    .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

  • @Bitzal你在做TDD,不错:) (2认同)