小编Him*_*bas的帖子

orElseGet 在可选<List<Entity>> 的情况下如何工作

我有一个类的可选列表,即:Optional<List<MyEntity>> opListEntity

我需要将所有映射MyEntityMyEntityDto可选存在时。如果Optional为空,我将返回一个空的ArrayList


方法 1(非功能性):

注意:myEntityMapper是一个映射器类的对象,它映射MyEntityMyEntityDto.

List<MyEntityDto> res;
if (opListEntity.isPresent()) {
       res = opListEntity.get().stream()
            .map(myEntityMapper::entityToDto)
            .collect(Collectors.toList());
} else {
       res = new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)

这种方法很好,但IntelliJ建议将其转换为函数式表达式。我让 IntelliJ 进行转换,这就是我得到的结果:

方法2(函数表达式):

List<MyEntityDto> res = opListEntity.map(myEntities -> myEntities.stream()
            .map(myEntityMapper::entityToDto)
            .collect(Collectors.toList()))
     .orElseGet(ArrayList::new);
Run Code Online (Sandbox Code Playgroud)

我不明白的是,在方法 2 @ 第 1 行中,为什么会有地图?

让我再解释一下。请参阅第三种方法:

方法三:

List<CustomerAddressEntity> myEntities = opListEntity
        .orElseGet(ArrayList::new);
List<MyEntityDto> res = myEntities.stream()
        .map(myEntityMapper::entityToDto)
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

方法 3 工作正常,但如果我尝试将方法 3 转换为方法 4,则不起作用。

方法四:

List<MyEntityDto> res …
Run Code Online (Sandbox Code Playgroud)

java functional-programming java-stream

3
推荐指数
1
解决办法
179
查看次数

标签 统计

functional-programming ×1

java ×1

java-stream ×1