Optional和Stream的map与flatMap

Optional的map和flatMap

Optional存在map和flatMap方法。map源码如下

    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));
        }
    }

map方法和Stream的map方法类似,都是对变量进行映射转换。

Optional.flatMap源码如下:

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和flatMap均要求optional对象非空才执行mapper方法,二者均返回Optional对象。但是map会自动将计算结果封装为Optional对象,而flatMap需要自己进行封装。

Stream的map和flatMap

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

map方法好说,是一个很简单的Function方法,输入参数类型?super T,输出参数类型为? extends R,是一种一对一的关系。将一个流映射成另外一个流。

假设需要将list的每个字符串都映射成为大写,

List<String> list = Arrays.asList("hello world","hello world");
list.stream().map(String::toUpperCase).forEach(s -> System.out.print(s+"8 "));
//HELLO WORLD8 HELLO WORLD8 

若现在需求变了,需要将list的每个字符串按照“ ”分割,分别处理每个单词(list共4个单词)。这里我们仍然使用map进行测试。

list.stream().map(s -> Stream.of(s.split(" "))).map(String::toUpperCase).forEach();

该代码存在语法错误,第二个map提示所需参数为Function<? super Stream, ? extend R> mapper。这说明第一个map产生了多个流(hello流和world流),这个时候就需要使用到flatMap了。jdk8对flatMap的解释为

Returns a stream consisting of the results of replacing each element of this stream with the contents of a mapped stream produced by applying the provided mapping function to each element.

意思很明确,流的每个元素都会产生一个新的流。这多个流会合并为一个流,作为flatMap的返回结果。

list.stream().flatMap(s -> Stream.of(s.split(" "))).map(String::toUpperCase).forEach(s -> System.out.println(s+"9 "));
//output:HELLO9 WORLD9 HELLO9 WORLD9 

 

ref:

https://www.cnblogs.com/ilovena/p/10461529.html

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Optional中的mapflatMap方法在处理可选值时有不同的作用。 - map方法接受一个函数作为参数,该函数会对Optional中的值进行处理,并返回一个新的Optional对象。如果原始Optional对象为空,则map方法不做任何处理,直接返回一个空的Optional对象。因此,map方法可以用于对Optional中的值进行转换或操作。 - flatMap方法也接受一个函数作为参数,但该函数的返回值必须是一个Optional对象。它将对Optional中的值进行处理,然后将返回的Optional对象展开为一个单独的Optional对象。如果原始Optional对象为空,则flatMap方法不做任何处理,直接返回一个空的Optional对象。因此,flatMap方法可以用于在处理Optional值时避免产生多层嵌套的Optional对象。 这两个方法的区别在于,map方法将对Optional值进行处理并返回一个新的Optional对象,而flatMap方法将对Optional值进行处理并返回一个展开的Optional对象。 参考资料: - :http://stackoverflow.com/questions/22350722/can-someone-explain-to-me-the-difference-between-map-and-flatmap-and-what-is-a-g - :http://spark.apache.org/docs/latest/programming-guide.html#transformations - :http://blog.csdn.net/samhacker/article/details/41927567<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Streammapflatmap的区别,一看就懂](https://blog.csdn.net/qq_35058851/article/details/127705480)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Spark中mapflatMap的区别详解](https://blog.csdn.net/Will_cruise/article/details/103192968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值