【发布时间】: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