鉴于此代码:
class PositionValue {
Object value;
boolean deleted;
}
class Position {
Optional<PositionValue> value = Optional.empty();
}
Position getPosition() {
return positionRepository.findSomePosition();
}
Position findCorrectPosition() {
Position position = getPosition();
return position.value.map(this::finalizeOrNext).orElse(position);
}
Position finalizeOrNext(PositionValue positionValue) {
if (positionValue.deleted) {
return moveToNextPosition(positionValue);
} else {
return finalPosition(positionValue);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法避免明确声明position变量findCorrectPosition?换句话说,我想orElse函数来引用他的getPosition()调用结果.
代码中没有"自我"关系.该Optional含有PositionValue或不好,不包含它,因为orElse是如果唯一相关的Optional是空的.
有一个Position实例提到这Optional一点的事实并不是建立一种特殊的关系; 可能还有很多其他对象也有参考Optional.
简化代码的唯一方法是在知道所需上下文的位置创建支持方法Position:
class Position {
Optional<PositionValue> value = Optional.empty();
public Position mapOrSelf(Function<? super PositionValue, ? extends Position> f) {
return value.map(f).orElse(this);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你就可以使用它:
Position findCorrectPosition() {
return getPosition().mapOrSelf(this::finalizeOrNext);
}
Run Code Online (Sandbox Code Playgroud)