Stream 的 flatMap 和 map 方法

一、源码定义

Stream.map:

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

 Stream.flatMap:

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

二、主要区别

1. 传入的函数返回类型不同
        map:传入的函数返回一个单个对象。map 会将流中的每个元素转换为另一个对象,但不会改变流的结构。
        flatMap:传入的函数返回一个流(Stream)。flatMap 会将流中的每个元素转换为一个流,然后将这些流合并成一个单一的流。
2. 处理嵌套结构的方式不同
        map:不会展平嵌套的结构。使用 map 会生成一个嵌套的流(例如 Stream<List<T>>)。
        flatMap:会展平嵌套的结构。使用 flatMap 会将嵌套的流合并成一个单一的流(例如 Stream<T>)。


三、代码示例

使用 map
假设我们有一个 List<List<Integer>>,我们使用 map 将每个内部列表转换为一个新列表:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Example {
    public static void main(String[] args) {
        List<List<Integer>> nestedList = Arrays.asList(
            Arrays.asList(1, 2),
            Arrays.asList(3, 4)
        );

        List<List<Integer>> mappedList = nestedList.stream()
            .map(innerList -> innerList.stream().map(x -> x * 2).collect(Collectors.toList()))
            .collect(Collectors.toList());

        System.out.println(mappedList); // 输出: [[2, 4], [6, 8]]
    }
}

使用 flatMap
同样的 List<List<Integer>>,我们使用 flatMap 将其展平为一个单一的 List<Integer>:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Example {
    public static void main(String[] args) {
        List<List<Integer>> nestedList = Arrays.asList(
            Arrays.asList(1, 2),
            Arrays.asList(3, 4)
        );

        List<Integer> flattenedList = nestedList.stream()
            .flatMap(List::stream) // 将每个内部列表转换为一个流,并合并这些流
            .map(x -> x * 2) // 对每个元素进行操作
            .collect(Collectors.toList());

        System.out.println(flattenedList); // 输出: [2, 4, 6, 8]
    }
}

四、总结

map:适用于将流中的每个元素转换为另一个对象,但不会改变流的结构。
flatMap:适用于将流中的每个元素转换为一个流,并将这些流合并成一个单一的流,从而展平嵌套的结构。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值