Java 8 可选/功能代码优化
Java 8 Optional / functional code optimization
有一个接收"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,它看起来很奇怪,在收集之后是否有任何实用的方法来替换该对象?
尝试使用 Optional.map
:
Optional.ofNullable(someObj.getASet())
.map(set -> set.stream()
.map(c -> AService.getExistingA(c.getId()))
.collect(Collectors.toSet()))
.ifPresent(set -> someObj.setASet(set));
现在,转换逻辑和条件命令 "set the result" 是分开的。
或者,旧的备用数据库也能工作——使用它并不丢人:
Set set = someObj.getASet();
if (set != null) {
Set newSet = set.stream()
.map(c -> AService.getExistingA(c.getId()))
.collect(Collectors.toSet());
someObj.setASet(newSet);
}
有一个接收"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,它看起来很奇怪,在收集之后是否有任何实用的方法来替换该对象?
尝试使用 Optional.map
:
Optional.ofNullable(someObj.getASet())
.map(set -> set.stream()
.map(c -> AService.getExistingA(c.getId()))
.collect(Collectors.toSet()))
.ifPresent(set -> someObj.setASet(set));
现在,转换逻辑和条件命令 "set the result" 是分开的。
或者,旧的备用数据库也能工作——使用它并不丢人:
Set set = someObj.getASet();
if (set != null) {
Set newSet = set.stream()
.map(c -> AService.getExistingA(c.getId()))
.collect(Collectors.toSet());
someObj.setASet(newSet);
}