我注意到,如果我通过以下方式使用“可选”:

Object returnValue = Optional.ofNullable(nullableValue)
         .map(nonNullValue -> firstMethod(arg1, nonNullValue))
         .orElse(secondMethod)

当nullableValue不为null时,它将同时执行第一种方法和第二种方法。难道我做错了什么?我希望它在nullableValue不为null时仅执行firstMethod。

map和flatMap似乎具有preCondition(if(!isPresent())。但是,orElse没有。如何在不使用if非null条件的情况下使用java8编写代码?

根据注释,示例代码:
public static String firstMethod(String someString) {
        System.out.println("In first method");
        return someString;
    }

    public static String secondMethod() {
        System.out.println("In second method");
        return "secondMethod";
    }

    public static void main(String a[]) {
        String nullableString = "nonNullString";
        String result = Optional.ofNullable(nullableString)
                .map(nonNullString -> firstMethod(nonNullString))
                .orElse(secondMethod());
        System.out.println("Result: "+result);
    }

输出:
In first method
In second method
Result: nonNullString

最佳答案

您正在调用第二种方法作为参数传递给orElse()调用。 orElse()不是像secondMethod()调用中那样调用map的人。您正在传递的是secondMethod()返回的值,而不是方法本身。

你想做什么:
Optional.ofNullable(nullableValue).map(MyClass::firstMethod).orElseGet(MyClass::secondMethod);
这是将secondMethod转换为供应商。这样,仅当optional为null时才调用它。

07-27 18:00