使用Optional Java 8避免在List处理中进行"空检查"

hen*_*xin 1 functional-programming nullable optional java-8 java-stream

在Class中Site,我有两种实用方法.

第一个,如果没有错误发生parseStub,则解析Site为a ; 否则,它返回.使用:Master nullOptional

public static Optional<Master> parseStub(Site site) {
    // do some parse work; return Optional.empty() if the parse fails.
}
Run Code Online (Sandbox Code Playgroud)

第二种方法parseStubs是解析的列表Site到的列表Master.它重用parseStub,并且必须处理可能为空的Optional<Master>:

public static List<Master> parseStubs(List<Site> sites) {
    return sites.stream()
            .<Master>map(site -> Site.parseStub(site).orElse(null))
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的代码中,我null再次介绍.
我怎么能避免null(和filter(Objects::nonNull))使用Optional一致?

Bri*_*etz 6

这是一种方式:

return sites.stream()
        .map(Site::parseStub)
        .filter(Optional::isPresent)
        .map(Optional::get)
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)