Java8 :: flatMap 可选

Java8 :: flatMap in optional

I am new to Java8. In recent project I am trying Optional with map and flatmap to prevent NPE.

我尝试使用可选的 map 和 flatmap,但是当我使用 flatMap 时,编译器出错。

public class Project {
    private ApplicationType applciationType;
}


@Getter
@Setter
public class ApplicationType {

    public String getDirectory() {      
        return "Inside my directory";
    }
}


public class Driver {

    public static void main(String[] args) {
        ApplicationType appType = new ApplicationType();
        Project project = new Project(appType);

         //When using map its running fine.
        Optional.ofNullable(project)
        .map(prjct-> prjct.getApplciationType())
        .map(appType1 -> appType1.getDirectory())
        .ifPresent(e -> System.out.println(e));

        //When using flatMap.. comiplation error.
        Optional.ofNullable(project)
        .map(prjct-> prjct.getApplciationType())
        .flatMap(appType1 -> appType1.getDirectory())
        .ifPresent(e -> System.out.println(e));

    }

}

抱歉,如果我遗漏了一些基本信息。 只是想在未来的项目中学习和实施 java8 功能。

我收到编译错误 -> [无法推断 flatMap(Function>) 的类型参数]

Optional.flatMap() 的目的是从函数中解包 Optional

例如,如果您的 getDirectory returns Optional<String>,那么 .map() 调用会给您 Optional<Optional<String>>,但是如果您使用 flatMap() - 它只给你 Optional<String>.

flatMap的签名:

public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)

Function 应该是 return 和 Optional,所以要使用它,您需要写:

Optional.ofNullable(project)
    .map(prjct-> prjct.getApplciationType())
    .flatMap(appType1 -> Optional.ofNullable(appType1.getDirectory()))
    .ifPresent(e -> System.out.println(e));

当然,在此示例中使用 map 更有意义(如在您的第一个片段中,它通过了编译)。