欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK8的Optional类中map方法和flatMap方法的区别

程序员文章站 2022-03-04 11:49:20
...

文章目录

先说结论:两种的区别是map的返回值Optional对象是在map方法里面自动封装好了。而flatMap方法是自己的实现的逻辑中自己封装。

1、源码
    public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }

    public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Objects.requireNonNull(mapper.apply(value));
        }
    }

注意map方法中最后一行代码为Optional.ofNullable,这是返回的时候自动把返回值包装好了。

2、例子

假设教师类里有一个地址的字段。地址类有城市字段。

//使用map
Optional<String> s1 = Optional.ofNullable(teacher1).map(tempTeacher -> tempTeacher.getAddress()).map(tempAddress -> tempAddress.getCity());
//或者简写为下面代码
 Optional<String> s1 = Optional.ofNullable(teacher1).map(Teacher1::getAddress).map(Address::getCity);

//使用flatMap
//报错
Optional.ofNullable(teacher1).flatMap(Teacher1::getAddress);
//正确写法
Optional<String> s2 = Optional.ofNullable(teacher1).flatMap(tempTeacher -> Optional.ofNullable(tempTeacher.getAddress())).flatMap(tempAddress -> Optional.ofNullable(tempAddress.getCity()));

可以明显看到,flatmap需要自己包装返回值为Optional对象。而map自动包装好了。




【正在去BAT的路上修行!!!】