给定 Guava 不可变表,我需要处理所有单元格,并根据返回 Java 可选的映射器结果过滤掉一些单元格,
immutbleTable.cellSet()
.parallelStream()
.map(cell -> processAndGetOptionalResult(cell))
.filter(cell -> cell.isPresent())
.map(cell -> cell.get())
.collect(Collector.of(
ImmutableTable.Builder::new,
ImmutableTable.Builder::put,
(l, r) -> l.putAll(r.build()),
ImmutableTable.Builder<String,String,String>::build)
);
}
有没有更好的方法来实现这一目标?有没有办法可以删除“map(cell -> cell.get())”并通过累加器本身收集 cell.get() ?
最佳答案
除了使用方法引用之外:
immutbleTable.cellSet()
.parallelStream()
.map(this::processAndGetOptionalResult)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collector.of(
ImmutableTable.Builder::new,
ImmutableTable.Builder::put,
(l, r) -> l.putAll(r.build()),
ImmutableTable.Builder<String,String,String>::build)
);
}
答案是否 - 在当前(JDK 8)API 中没有更好的方法来实现这一点。在 JDK 9 中,Optional
将具有 .stream()
方法,该方法允许使用一个操作 - flatMap
:
immutbleTable.cellSet()
.parallelStream()
.map(this::processAndGetOptionalResult)
.flatMap(Optional::stream)
.collect(Collector.of(
ImmutableTable.Builder::new,
ImmutableTable.Builder::put,
(l, r) -> l.putAll(r.build()),
ImmutableTable.Builder<String,String,String>::build)
);
}
关于java - 收集可选项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39563582/