【问题标题】:Java 8 Optional / functional code optimizationJava 8 可选/功能代码优化
【发布时间】:2017-03-01 04:49:54
【问题描述】:

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

【问题讨论】:

    标签: optimization java-8 null-check


    【解决方案1】:

    尝试使用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);
    }
    

    【讨论】:

    • 在我的脑海中,这会打破,所以我只是阅读了 Map inside optional 的文档:如果存在值,则对其应用提供的映射函数,如果结果为非空,则返回可选描述结果。否则返回一个空的 Optional。我喜欢它,谢谢
    • 但是更好的选择是修复 API 设计。如果getASet() 永远不会返回null,而只是一个空集,那么整个Optional/条件逻辑就变得不必要了。
    • @Holger 这是个好主意,但我正在使用 lombok 自动生成 getter 和 setter,这样会破坏我所有的代码,这仍然是一个非常好的主意,也许在我的下一个新的项目我会做的
    • @Als:我确定自动生成的代码没有引入nulls,所以当getter返回null时,属性本身就是null,应该是一开始就阻止了。同样,集合类型的属性不应包含对可能在其他地方发生变异的对象的引用,因此如果它是可变集合,setter 应始终通过复制参数来保护它,或者拒绝null 或替换它与空集合。如果自动生成的代码没有提供这个,而是盲目地存储了它得到的任何引用,你不应该使用那个生成器……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2021-05-27
    • 2010-11-27
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多