Java 8可选:引用“中的self”;orElse“;功能

Java 8可选:引用“中的self”;orElse“;功能,java,java-8,Java,Java 8,鉴于此代码: class PositionValue { Object value; boolean deleted; } class Position { Optional<PositionValue> value = Optional.empty(); } Position getPosition() { return positionRepository.findSomePosition(); } Position findCorrectP

鉴于此代码:

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);
    }
}
类位置值{
目标价值;
删除布尔值;
}
阶级地位{
可选值=Optional.empty();
}
位置getPosition(){
返回positionRepository.findSomePosition();
}
位置查找错误位置(){
位置=getPosition();
返回position.value.map(this::finalizeOrNext).orElse(position);
}
位置finalizeOrNext(位置值位置值){
if(positionValue.deleted){
返回moveToNextPosition(位置值);
}否则{
返回最终位置(位置值);
}
}

有没有办法避免在
findCorrectPosition
中显式声明
position
变量?换句话说,我希望
orElse
函数引用
getPosition()
调用的结果。

代码中没有“自我”关系。
Optional
包含一个
PositionValue
,或者不包含它,因为
orElse
仅在
Optional
为空时才相关

有一个
位置
实例引用该
可选
的事实并没有建立特殊关系;可能还有很多其他对象也引用了该
可选

简化代码的唯一方法是在知道所需上下文的位置创建一个支持方法,
Position

class Position {
    Optional<PositionValue> value = Optional.empty();
    public Position mapOrSelf(Function<? super PositionValue, ? extends Position> f) {
        return value.map(f).orElse(this);
    }
}

我不知道有什么办法可以这样做。我认为你已经把代码做得非常紧凑了。如果你对此持肯定态度,请随意将其作为一个实际的答案发布。我认为@Holger已经正确地、更完整地回答了这个问题,所以我就顺其自然了。然而,我想说,我更喜欢你目前的实施方案,而不是他建议的可能的替代方案。我的感觉是,另一层间接操作只会让事情变得一团糟。一般来说,OPs设计(在另一个对象中有一个
可选
字段)看起来很奇怪:为什么需要这样的双重装箱?尽管如此,假设这样的字段是绝对必要的,您的解决方案看起来是最好的。@Tagir Valeev:对,在字段中有
可选的
s是一种不常见的模式。
mapOrSelf
方法的优点是,在改装
Position
以不使用
Optional
Position findCorrectPosition() {
    return getPosition().mapOrSelf(this::finalizeOrNext);
}