Java 8平面图+;可选.of不';不编译

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:

我正在尝试在Java中使用
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());