【发布时间】:2017-10-31 22:53:46
【问题描述】:
我想从地图中删除 value 为空 Optional 的所有条目。看起来没什么复杂的,但我正在尝试找到一个更好的解决方案。
输入:
我有以下地图:
Map<String, Function<String, Optional<String>>> attributesToCalculate = new HashMap<>();
其中 key - 只是一个字符串和 value - 对返回 Optional
的方法的引用输出:
结果,我想得到
Map<String, String> calculatedAttributes
(不包括 value 为空 Optional 的条目)
这是我的解决方案
return attributesToCalculate.entrySet()
.stream()
.map(entry -> Pair.of(entry.getKey(), entry.getValue().apply(someString)))
.filter(entry -> entry.getValue().isPresent())
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().get()));
但我不喜欢 .filter 部分,因为我必须在 collect 部分中的 Optional 上调用 .get()。
有没有更好的方法(可能没有 .get 调用)来解决这个问题?谢谢。
【问题讨论】:
-
如果你之前检查过有值,调用get()没有错。
-
好问题,伙计 :) 如果您在类路径中有 StreamEx,您可以通过
EntryStream#mapValues/filterValues将值与键分开处理。但我会继续 @Paul Boddington 的回答,因为它不会滋生不需要的Pairs。 -
@AndrewTobilko,嗨 :) 我也这么认为。保罗的回答完全适合我的情况。至于 StreamEx,不幸的是,我们不使用它 =/
标签: java collections java-stream optional