当需要对结果调用方法时,如何使用 orElse?

How to use orElse when you need to invoke a method on the result?

我有以下代码打击。我试图找到一种方法来避免 if (something.isPresent()) 行并声明 Optional<Something> something 。相反,我想直接链接 Optional.orElse() 方法和 return 结果。但我似乎找不到办法,因为如果找不到元素,该方法需要 return null,如果找到,它需要在 [=18= 之前调用它的方法]ing.

有更好的方法吗?

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class OrElseWhat {

    private class Something {
        private String it;
        Something(String it) { this.it = it; }
        String getIt() { return it; }
    }

    private List<Something> somethings = new ArrayList<Something>() {
        {
            add(new Something("one"));
            add(new Something("two"));
            add(new Something("three"));
        }
    };

    public String getFourOrNull() {
        Optional<Something> something = somethings.stream()
                .filter(s -> s.getIt().equals("four"))
                .findAny();

        if (something.isPresent()) {
            return something.get().getIt();
        }

        return null;
    }
}

您可以在您的值仍处于 Optional 形式时使用 map:

调用该方法
public String getFourOrNull() {
    return somethings.stream()
            .filter(s -> s.getIt().equals("four"))
            .findAny()
            .map(Something::getIt)
            .orElse(null);
}

来自 mapsdocumentation:

If a value is present, apply the provided mapping function to it, and if the result is non-null, return an Optional describing the result. Otherwise return an empty Optional.

就是说,如果可以的话,听听@Aaron 并删除 orElse,以便 getFourOrNull return 成为 Optional。在使用 Optional 的代码库中,任何方法都不应该 return null

我认为您应该将方法的签名更改为 Optional<String> 并且始终 return something.

Optional 是为这种情况而设计的:它们可以避免 returning 一些非特定值(也许是 null"" ? 或 -1) 并从您的签名开始明确描述也许您可以 return 某种类型,但并非总是如此。