Java 如何使用可选的.ofNullable和Stream

Java 如何使用可选的.ofNullable和Stream,java,java-stream,optional,Java,Java Stream,Optional,我正在做一个测试用例,将Optional.ofNullable和Stream一起使用,我面临着同样的方法,两者都有相同的输出 List<String> list1 = List.of("abc","abc"); Optional.ofNullable(list1).stream().flatMap(List::stream).map(e -> e.concat("def")).collect(Collectors.toList()); List<String> l

我正在做一个测试用例,将Optional.ofNullable和Stream一起使用,我面临着同样的方法,两者都有相同的输出

List<String> list1 = List.of("abc","abc");
Optional.ofNullable(list1).stream().flatMap(List::stream).map(e -> e.concat("def")).collect(Collectors.toList());

List<String> list2 = List.of("abc","abc");
Stream<String> stream = Optional.ofNullable(list2).map(List::stream).orElseGet(Stream::empty);
stream.map(e-> e.concat("def")).collect(Collectors.toList());
List list1=List.of(“abc”、“abc”);
可选.ofNullable(list1).stream().flatMap(List::stream).map(e->e.concat(“def”).collect(Collectors.toList());
List list2=列表中的(“abc”、“abc”);
Stream-Stream=Optional.ofNullable(list2).map(List::Stream).orElseGet(Stream::empty);
stream.map(e->e.concat(“def”)).collect(Collectors.toList());

我的问题是,为什么在第一个例子中我使用一个平面图和一个平面图,而在第二个例子中我使用两个平面图来做同样的工作。如果我在第一个示例中尝试使用两个map,它将不起作用。

要了解发生了什么,可以查看所有返回类型:

第一个示例:

List list1=List.of(“abc”、“abc”);
列表结果=
Optional.ofNullable(list1)//可选
.stream()//流
.flatMap(列表::流)//流
.map(e->e.concat(“def”)//流
.collect(Collectors.toList());//列表
在本例中,您直接从
可选
转到
,然后使用后一个接口的方法。此处使用的方法(按顺序):

  • 第二个示例:

    List list2=List.of(“abc”、“abc”);
    列表结果=
    Optional.ofNullable(list2)//可选
    .map(List::stream)//可选
    .orElseGet(流::空);//流动
    .map(e->e.concat(“def”)//流
    .collect(Collectors.toList());//列表
    
    在本例中,从
    可选
    可选
    (另一个可选),然后通过
    可选#OrelGet(供应商)
    提取
    。然后,使用
    接口的方法。此处使用的方法(按顺序):


  • 要了解发生了什么,可以查看所有返回类型:

    第一个示例:

    List list1=List.of(“abc”、“abc”);
    列表结果=
    Optional.ofNullable(list1)//可选
    .stream()//流
    .flatMap(列表::流)//流
    .map(e->e.concat(“def”)//流
    .collect(Collectors.toList());//列表
    
    在本例中,您直接从
    可选
    转到
    ,然后使用后一个接口的方法。此处使用的方法(按顺序):

  • 第二个示例:

    List list2=List.of(“abc”、“abc”);
    列表结果=
    Optional.ofNullable(list2)//可选
    .map(List::stream)//可选
    .orElseGet(流::空);//流动
    .map(e->e.concat(“def”)//流
    .collect(Collectors.toList());//列表
    
    在本例中,从
    可选
    可选
    (另一个可选),然后通过
    可选#OrelGet(供应商)
    提取
    。然后,使用
    接口的方法。此处使用的方法(按顺序):


  • 如果您将
    flatMap
    替换为
    map
    ,那么您将得到一个
    流,而不是
    流。我不明白,如果我将第一个流替换为map,它将返回一个流,但为什么在第二个示例中,当我使用变量流接收它时,它返回一个流?我阅读了文档,但仍然不清楚它为什么会这样工作。如果将
    flatMap
    替换为
    map
    ,那么您将得到一个
    Stream
    ,而不是
    Stream
    。我明白了一点,如果我将第一个替换为map,它将返回一个流,但为什么在第二个示例中,当我使用变量流接收它时,它返回一个流?我阅读了文档,但它仍然不清楚,为什么它是这样工作的。虽然在实践中人们应该真正避免**(集合)
    Optional.of**(Collection)
    首先,Slaw,感谢您真正解释的答案。还有Naman,你为什么这么说?在这种情况下,如果没有可选的?如果?提前感谢。@ArturReis是一个
    可选的
    ,通常仅用作返回类型,以指示结果可能存在或不存在。在本地创建一个
    可选的
    ,只是为了使用它的方法,并让你的代码更具功能性,这至少是一些社区不赞成的。我个人不喜欢它。此外,当一个集合用作返回类型时,最好返回一个空集合来表示没有结果,而不是
    null
    。因此,包含集合的
    可选
    是可疑的。我相信那就是Naman所指的。
    Optional.ofNullable(列表1)。stream()
    已经过时了,你可以直接使用
    stream.ofNullable(列表1)
    ,不过实际上应该避免
    Optional.of**(集合)
    首先,Slaw,谢谢你真正解释过的答案。Naman,你为什么这么说?在这种情况下,如果没有可选的?如果?提前感谢。@ArturReis是一个
    可选的
    ,通常仅用作返回类型,以指示结果可能存在或不存在。在本地创建一个
    可选的
    ,只是为了使用它的方法,并让你的代码更具功能性,这至少是一些社区不赞成的。我个人不喜欢它。此外,当集合用作返回类型时,将空集合返回给indi被认为是最佳做法