【问题标题】:How to simplify code by Optional or stream or lambda?如何通过 Optional 或 stream 或 lambda 简化代码?
【发布时间】:2019-11-27 09:22:37
【问题描述】:

我有一些代码要重构以简化它:

 public ObjectB doSomethingHere(ObjectA objectA, List<ObjectB> objectBList) {

 boolean emptyObject = objectA == null;
    boolean emptyList = CollectionUtils.isEmpty(objectBList);
    if (emptyObject || emptyList) {
      throw new SomeException("ERROR",
          emptyObject ? null : objectA.getId(),
          emptyList ? 0 : objectBList.size());
    }

    return objectBList
        .stream()        
        .filter(p -> doSomeStuff(p,objectA))
        .min(Comparator.comparingInt(ObjectB::getSort))
        .orElse(null);

         }

返回部分是逻辑在布尔表达式不正确的情况下应该执行的操作(错误处理)。

我猜这可以“一次性”处理,例如:

Optional.ofNullable(xxx ).orElseThrow(yyyy);

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 我会首先尊重 Java 命名约定。然后我会删除该方法的第一个参数,因为你对它没有任何用处。然后我将停止使用 CollectionUtils 并检查 null 列表:永远不要传递 null 集合。如果你这样做,NullPointereException 是正确的抛出。所以整个第一部分实际上可以被删除,剩下的就是有用的部分,从return开始。应该使用comparingInt(),并且应该考虑返回 Optional 而不是 null。
  • 我见过的Optional 最糟糕的用途之一。可以用object_A == null替换Optional.ofNullable(object_A).isEmpty()
  • 过滤器应该在排序之前,出于性能原因,排序+findFirst应该替换为min()。
  • 改成代码了,但还是没有回答原来的问题:我能不能把错误处理部分和逻辑部分简化成一个可选表达式,例如类似 doLogic.orElse(errorHandling)
  • 对此,“改成代码,但还是没有回答原来的问题:我能不能把错误处理部分和逻辑部分简化成一个可选表达式,比如doLogic.orElse(errorHandling) ",我们可以,但问题是,它会使代码更复杂。

标签: java lambda java-stream optional


【解决方案1】:

我认为您对Optional 的使用并没有真正添加任何东西,因为您实际上只是在检查该值是否为空。所以我建议:

if (objectA == null || objectBList.isEmpty())

您的流操作可以是:

return objectBList.stream()
    .filter(...)
    .min(...).orElse(null);

【讨论】:

  • CollectionUtils.isEmpty 检查 null 和空。但是objectBList.isEmpty()可能会导致空指针异常。
  • 对于第一部分 Optionial 没有意义,真的。我编辑了代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多