Java8 :: FlatMap在可选中

时间:2019-06-10 06:42:19

标签: java java-8 optional flatmap

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>)的类型参数]

2 个答案:

答案 0 :(得分:0)

Optional.flatMap()的目的是从功能中解开Optional

例如,如果您的getDirectory返回Optional<String>,则.map()调用会给您Optional<Optional<String>>,但是如果您使用flatMap()-它会给您Optional<String>

答案 1 :(得分:0)

请参阅flatMap的签名:

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

Function应该返回一个Optional,因此要使用它,您需要编写:

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

当然,在此示例中,使用map更有意义(就像在您的第一个摘要中一样,它通过了编译)。