鉴于此代码:
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);
}
}
有没有办法避免在position
中明确声明findCorrectPosition
变量?换句话说,我希望orElse
函数引用getPosition()
调用的结果。
答案 0 :(得分:6)
您的代码中没有“自我”关系。 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);
}
}
:
Position findCorrectPosition() {
return getPosition().mapOrSelf(this::finalizeOrNext);
}
然后你就可以使用它:
<div id="results" class="results" style="height: 590px; overflow-y: scroll"></div>