如何将Optional.isPresent()+ Optional.get()重构为Optional.ifPresent()?

时间:2017-01-11 11:16:38

标签: java lambda refactoring optional

我有一个代码:

public interface A{
    default Optional<MyClass> getMyClass() { 
        return Optional.empty(); 
    }

    default boolean isPresent(){ 
        return getMyClass().isPresent();
    }
}

public enum MyEnum implements A{
    private MyClass someObject;

    MyEnum(MyClass someObject) {
        this.someObject = someObject;
    }

    //...
    @Override
    public Optional<MyClass> getMyClass() {
        return Optional.ofNullable(someObject);
    }
}

我想将此代码更改为Optional.ifPresent()之类的内容。我需要这个,而不是我现在拥有的Optional.isPresent + Optional.get

我尝试执行Optional.ofNullable(someObject).ifPresent()之类的操作,但我不知道应该在ifPresent()参数中放置什么来获得与上面代码相​​同的结果。

编辑:

从评论中我了解到解决方案就是改变 if(something.isPresent()){ //do something }something.getMyClass().ifPresent(val -> //do something); 在我使用接口的类中。

1 个答案:

答案 0 :(得分:1)

安洛先,

案例1

if(something.isPresent())
{ 
    //do something 
}

在此块中,您可以使用非最终变量,例如:

String myString = null;
if(something.isPresent())
{ 
    myString = "Hello";
}

案例2

something.getMyClass().ifPresent(val -> //do something);

在此块中,您无法使用非最终变量,例如:

String myString = null;
something.getMyClass().ifPresent(val -> myString = "Hello"); // does not work

要解决此问题,您需要使用一个元素列表:

final String myString[] = {""};
something.getMyClass().ifPresent(val -> myString[0] = "Hello"); // will work

如果你有最终对象,那么你可以调用它的方法来修改它:

final SomeClass object = new SomeClass();
something.getMyClass().ifPresent(val -> object.someMethod()); // will work

您也可以使用方法参考:

class SomeClass {

    // ... 

    public void calculate(MyClass value) {
        // do something
    }

    public void someMethod() {
        something.getMyClass().ifPresent(this::calculate);
    }
}