Java 8平面图+;可选.of不';不编译
我正在尝试在Java中使用Java 8平面图+;可选.of不';不编译,java,functional-programming,java-8,optional,flatmap,Java,Functional Programming,Java 8,Optional,Flatmap,我正在尝试在Java中使用flatMapOptionals。以下是一个简化的示例: List<String> x = Arrays.asList("a", "b", "c"); List<String> result = x.stream().flatMap((val) -> val.equals("b") ? Optional.empty() : Optional.of(val)).collect(Collectors.toList()); 它返回: res2:
flatMap
Optional
s。以下是一个简化的示例:
List<String> x = Arrays.asList("a", "b", "c");
List<String> result = x.stream().flatMap((val) -> val.equals("b") ? Optional.empty() : Optional.of(val)).collect(Collectors.toList());
它返回:
res2: List[String] = List(a, c)
正如所料
如何将其转换为Java以便进行编译?
flatMap
应将输入流的元素映射到不同的流中。因此,它必须返回流
,而不是可选的
因此,您应该这样做:
List<String> x = Arrays.asList("a", "b", "c");
List<Optional<String>> result =
x.stream()
.flatMap((val) ->
val.equals("b") ? Stream.of(Optional.empty()) :
Stream.of(Optional.of(val)))
.collect(Collectors.toList());
这里不需要处理可选的
最简单的直接解决方案是使用过滤器
List<String> result = x.stream()
.filter(val -> !val.equals("b"))
.collect(Collectors.toList());
如果您必须处理不可避免地产生可选
的操作,则必须将其转换为流
,以便使用流.flatMap
:
List<String> result = x.stream()
.map(val -> val.equals("b") ? Optional.<String>empty() : Optional.of(val))
.flatMap(o->o.map(Stream::of).orElse(Stream.empty()))
.collect(Collectors.toList());
List result=x.stream()
.map(val->val.equals(“b”)?可选的.empty():可选的.of(val))
.flatMap(o->o.map(Stream::of).orElse(Stream.empty())
.collect(Collectors.toList());
谢谢!通常我会过滤。在这种情况下(真实的情况,而不是简化的玩具示例),我宁愿使用Optionals,因为过滤意味着要挖掘大量垃圾,这也是我在映射阶段必须要做的。当流的每个元素都映射到一个可选
,就不需要使用平面映射。只要使用.map(val->val.equals(“b”)?Optional.empty():Optional.of(val))
@Holger你完全正确。我没想过。我是按照OP的决定使用flatMap的。@Holger如果我只使用.map而不是.flatMap,我得到的是列表而不是所需的列表。在scala中也没有类似的平坦:(那么,什么是获取列表的最简单方法呢?我知道我可以过滤然后再次映射,但它开始太冗长了……是的,我在第一条评论中说了为什么我想使用可选。在这个玩具示例中,是的,过滤将是一种方法。但我有一个现实案例,可选会更好。)(但似乎只有在Scala中,Java并没有做到这一点)
List<String> result =
x.stream()
.filter (val -> !val.equals("b"))
.collect(Collectors.toList());
List<String> x = Arrays.asList("a", "b", "c");
List<Optional<String>> result =
x.stream()
.map((val) -> val.equals("b") ? Optional.empty() : Optional.of(val))
.collect(Collectors.toList());
List<String> result = x.stream()
.filter(val -> !val.equals("b"))
.collect(Collectors.toList());
List<String> result = x.stream().flatMap(
val -> val.equals("b")? Stream.empty(): Stream.of(val))
.collect(Collectors.toList());
List<String> result = x.stream()
.map(val -> val.equals("b") ? Optional.<String>empty() : Optional.of(val))
.flatMap(o->o.map(Stream::of).orElse(Stream.empty()))
.collect(Collectors.toList());