【发布时间】:2017-06-21 03:52:59
【问题描述】:
我从不受我控制的服务中获取了一个地图,该地图可能为 null,并且想要对其进行处理,比如过滤、映射和缩减为我需要的单个元素。
问题:是否有从 Optional 到 Stream 的“链接”?
我尝试过(除其他外):
return Optional.ofNullable(getMap())
.map(Map::entrySet) // gets the entryset
.map(Stream::of)
.orElseGet(Stream::empty)
// i would then like to continue with
.filter(e -> e.getKey().startsWith("f")
.map(Entry::getValue)
.findFirst();
但后来我得到的不是Stream<Entry>,而是Stream<Set<Entry>> ...有没有办法以某种方式将集合或映射出Optional?
注意:我对这里的流畅、纯流/可选方法感兴趣。当我首先将地图保存到本地 var 并确保它不为空时,它当然可以工作。
【问题讨论】:
-
将 Stream
转换为 Stream ?不,我不能。 -
您可能应该考虑更改您的
getMap()以返回一个空地图而不是null。那时您不会将其包装在Optional中,并且您可以轻松避免此类问题。正如Stuart Marks 所说,Rule #4: It's generally a bad idea to create anOptionalfor the specific purpose of chaining methods from it to get a value.。 -
在 Java 9 中,
Optionalwill have astream()method,您可以这样做:Optional.ofNullable(getMap()).map(Map::entrySet).stream().flatMap(Set::stream)... -
是的,这看起来很有希望……但是我在企业环境中,我们花了几年时间才采用 Java8……不确定我会在 7 月切换 :-(跨度>
-
@JanGalinski 如果你是在企业环境中,已经采用了java8,应该庆幸,我想……我不会采用Java9,直到它相当成熟并且框架和库都一样成熟。
标签: java java-stream