Als*_*Als 1 optimization java-8 null-check
有一个接收"someObj"的方法,其目的是检查类型Set <>的var ASet,迭代它并用数据库对象替换它的对象.为此,我写了以下代码:
if(!CollectionUtils.isEmpty(someObj.getASet())){
someObj.setASet(
someObj.getASet()
.stream()
.map( c -> AService.getExistingA(c.getId()))
.collect(Collectors.toSet())
);
}
Run Code Online (Sandbox Code Playgroud)
这样做的目的,但我真的不满意它的可读性.
Optional.ofNullable(someObj.getASet())
.ifPresent( ASet-> someObj.setASet(
ASet.stream()
.map( c -> AService.getExistingA(c.getId()))
.collect(Collectors.toSet())
));
Run Code Online (Sandbox Code Playgroud)
现在它看起来更不易读,你能推荐更好的方法吗?我认为最糟糕的问题是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));
Run Code Online (Sandbox Code Playgroud)
现在,变换逻辑和条件命令"设置结果"是分开的.
或者,旧的备用数据库也可以工作 - 使用它时不会感到羞耻:
Set set = someObj.getASet();
if (set != null) {
Set newSet = set.stream()
.map(c -> AService.getExistingA(c.getId()))
.collect(Collectors.toSet());
someObj.setASet(newSet);
}
Run Code Online (Sandbox Code Playgroud)