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);
}