1

有一个接收“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,它看起来很奇怪,有没有什么功能性的方法可以在收集后替换该对象?

4

1 回答 1

6

尝试使用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 set = someObj.getASet();
if (set != null) {
    Set newSet = set.stream()
                    .map(c -> AService.getExistingA(c.getId()))
                    .collect(Collectors.toSet());
    someObj.setASet(newSet);
}
于 2016-10-19T14:26:47.380 回答