当前位置: 首页 > 知识库问答 >
问题:

Java8::flatMap可选[重复]

皇甫树
2023-03-14
I am new to Java8. In recent project I am trying Optional with map and flatmap to prevent NPE.
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));

    }

}

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

共有1个答案

慕飞章
2023-03-14

查看flatmap的签名:

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

函数应该返回一个可选,因此为了使用它,您需要编写:

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

当然,在本例中使用map更有意义(就像在第一个代码段中一样,它传递编译)。

 类似资料:
  • 考虑一个和方法。我想将s映射到s并获得第一个。显而易见的解决方案是使用,但要求返回一个流,而没有方法(或者它是或提供一个方法将其转换为,或将其作为)查看。 我能想出的最好的办法是: 但这似乎是一个很普通的案例,但却显得太冗长了。谁有更好的主意?

  • 我已经编码好了: 问题是返回一个。 因此,我得到了以下信息: 方法

  • 我知道Optionals ifPresent()调用的目的是替换空检查。从Oracle文档中提取代码示例,它在简单情况下似乎非常有用。例如: 我只是想了解为什么这被认为比空检查更好。可读性?表演在我看来,这会对项目性能造成影响,因为必须引入一个新的对象才能容纳我们最终希望获得的对象?总之,为什么这是 如果(声卡!=null),则认为比这更好。

  • 我正在解析输入JSON。对于一个字段,有3种可能: 字段不存在; 该值设置为NULL; 该值设置为有效值。 null

  • 有人能描述一下flatMap与compactMap的这种行为吗?compactMap不是刚刚重命名为flatMap吗?因为我发现他们表现不同 这是它打印的 有人能告诉我为什么当我使用嵌套数组不扁平吗?