Java 如何使用可选的.ofNullable和Stream
我正在做一个测试用例,将Optional.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
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被认为是最佳做法