Optimization Java 8可选/功能代码优化
有一个方法接收“someObj”,其目的是检查类型Set的var ASet,遍历它,并用数据库对象替换它的对象。为此,我编写了以下代码: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
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
或用空集合替换它。如果自动生成的代码没有提供这一点,但是无意识地存储它得到的任何引用,那么您不应该使用该生成器…