【发布时间】:2018-07-05 15:51:00
【问题描述】:
考虑以下类:
ClassA {
}
ClassB {
private ClassA classA;
// getters and setters
}
由于Optional 上没有可用的peek 方法,这是否被视为滥用Optional#map 方法:
return myService.findA()
.flatMap(a -> myService.findB(a) // also returns optional
.map(b -> {
b.setClassA(a);
return b;
}))
.map(d -> MyType.of(d)) // MyType being other class
.orElse(MyType.empty());
也可以这样写:
Optional<ClassA> optionalA = myService.findA();
if (optionalA.isPresent()) {
Optional<ClassB> optionalB = myService.findB(optionalA.get());
if (optionalB.isPresent()) {
ClassB classB = optionalB.get();
classB.setClassA(optionalA.get());
return MyType.of(classB);
}
return MyType.empty();
两种实现都执行相同的逻辑,是否应该优先于另一种?
【问题讨论】:
-
恕我直言,(a)是的,那是滥用,因为
map可能不会有任何副作用,并且(b)“旧式”代码可能是一个更冗长的机器人,但它是很多,很多更清晰,更容易理解。 -
同时java doc for peek说:这个方法的存在主要是为了支持调试。所以对于状态突变
peek或map使用什么是一个悬而未决的问题。请参阅peek 和map vs peek -
@AntonBalaniuc 也没有。
Optional类中已经有ifPresent,它明确地用于执行操作。 -
@tobias_k 不是“可能”而是“绝对”。传递给 map 的方法应该是函数,根据定义是纯函数。