Java 8可选:引用自我" orElse"功能

时间:2015-06-01 16:48:00

标签: java java-8

鉴于此代码:

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()调用的结果。

1 个答案:

答案 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>