Optimization Java 8可选/功能代码优化

Optimization Java 8可选/功能代码优化,optimization,java-8,null-check,Optimization,Java 8,Null Check,有一个方法接收“someObj”,其目的是检查类型Set的var ASet,遍历它,并用数据库对象替换它的对象。为此,我编写了以下代码: if(!CollectionUtils.isEmpty(someObj.getASet())){ someObj.setASet( someObj.getASet() .stream() .map( c -> AService.getE

有一个方法接收“someObj”,其目的是检查类型Set的var ASet,遍历它,并用数据库对象替换它的对象。为此,我编写了以下代码:

if(!CollectionUtils.isEmpty(someObj.getASet())){
        someObj.setASet(
            someObj.getASet()
                    .stream()
                    .map( c -> AService.getExistingA(c.getId()))
                    .collect(Collectors.toSet())
       );
    }
它确实有目的,但我真的不满意它的可读性

 Optional.ofNullable(someObj.getASet())
            .ifPresent( ASet->  someObj.setASet(
                                                ASet.stream()
                                                .map( c -> AService.getExistingA(c.getId()))
                                                .collect(Collectors.toSet())
            ));

现在它看起来更不可读了,你能推荐一个更好的方法吗?我认为最糟糕的问题是someObj.setASet,它看起来很奇怪,在收集之后是否有功能性的方法来替换该对象?

尝试使用
可选。map

Optional.ofNullable(someObj.getASet())
        .map(set -> set.stream()
                       .map(c -> AService.getExistingA(c.getId()))
                       .collect(Collectors.toSet()))
        .ifPresent(set -> someObj.setASet(set));
现在,转换逻辑和条件命令“设置结果”是分开的

或者,旧的备用设备也能工作——使用它并不羞耻:

Set set = someObj.getASet();
if (set != null) {
    Set newSet = set.stream()
                    .map(c -> AService.getExistingA(c.getId()))
                    .collect(Collectors.toSet());
    someObj.setASet(newSet);
}

尝试使用
可选。映射

Optional.ofNullable(someObj.getASet())
        .map(set -> set.stream()
                       .map(c -> AService.getExistingA(c.getId()))
                       .collect(Collectors.toSet()))
        .ifPresent(set -> someObj.setASet(set));
现在,转换逻辑和条件命令“设置结果”是分开的

或者,旧的备用设备也能工作——使用它并不羞耻:

Set set = someObj.getASet();
if (set != null) {
    Set newSet = set.stream()
                    .map(c -> AService.getExistingA(c.getId()))
                    .collect(Collectors.toSet());
    someObj.setASet(newSet);
}

在我的脑海中,这将打破,所以我只是阅读了可选的映射内的文档:如果存在一个值,应用提供的映射函数,如果结果是非空的,返回一个可选的描述结果。否则,返回一个空的可选值。我喜欢它,但更好的选择是修复API设计。如果
getASet()
从未返回
null
,而只是一个空集,那么整个
可选的
/条件逻辑就变得不必要了。@Holger这是个好主意,但我使用lombok自动生成getter和setter,这样会破坏我所有的代码,这仍然是个好主意,也许在我的下一个新项目中我会做that@Als:我确信自动生成的代码不会引入
null
s,因此当getter返回
null
时,属性本身就是
null
,这应该首先防止。类似地,集合类型的属性不应包含对可能在其他地方发生变异的对象的引用,因此,如果该对象是可变集合,则setter应始终通过复制参数进行保护,并拒绝
null
或用空集合替换它。如果自动生成的代码不提供这一点,但无意识地存储它所获得的任何引用,则不应使用该生成器…在我的头脑中,这会导致崩溃,因此我只需阅读Map内的文档可选:如果存在值,则对其应用提供的映射函数,如果结果为非null,返回一个描述结果的可选值。否则,返回一个空的可选值。我喜欢它,但更好的选择是修复API设计。如果
getASet()
从未返回
null
,而只是一个空集,那么整个
可选的
/条件逻辑就变得不必要了。@Holger这是个好主意,但我使用lombok自动生成getter和setter,这样会破坏我所有的代码,这仍然是个好主意,也许在我的下一个新项目中我会做that@Als:我确信自动生成的代码不会引入
null
s,因此当getter返回
null
时,属性本身就是
null
,这应该首先防止。类似地,集合类型的属性不应包含对可能在其他地方发生变异的对象的引用,因此,如果该对象是可变集合,则setter应始终通过复制参数进行保护,并拒绝
null
或用空集合替换它。如果自动生成的代码没有提供这一点,但是无意识地存储它得到的任何引用,那么您不应该使用该生成器…