Java 8可选:在"orElse"函数中引用self

Xor*_*rty 2 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法避免明确声明position变量findCorrectPosition?换句话说,我想orElse函数来引用他的getPosition()调用结果.

Hol*_*ger 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以使用它:

Position findCorrectPosition() {
    return getPosition().mapOrSelf(this::finalizeOrNext);
}
Run Code Online (Sandbox Code Playgroud)

  • 一般来说OP设计(在另一个对象中有单个`Optional`字段)看起来很奇怪:为什么这样的双拳可能是必要的?然而,在假设这样的场是绝对必要的情况下,你的解决方案看起来最好. (2认同)
  • @Tagir Valeev:对,"野外选择"是一种不常见的模式.关于`mapOrSelf`方法的好处是,当改进`Position`以不使用`Optional`时它会继续工作. (2认同)