MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

在 Java 中,map 和 flatMap 有什么区别

2025-01-09 13:07 huorong 精选文章 4 ℃ 0 评论

前言

在 Java 中,map 和 flatMap 是流(Stream)API中用于处理数据转换的操作,但它们的行为有所不同。

  • map:你可以把 map 想象成一个转换器,它对流中的每个元素进行一对一的转换。每个输入元素都被转换成一个输出元素,结果是一个新的流,流中的元素保持原有的结构。
  • flatMap:会比 map 中间多一个 flat 操作,像是一个“展平”的转换器。它不仅对每个元素进行转换,还将这些转换结果(通常是流或集合)合并成一个单一的流。它可以将嵌套的结构“展平”,去掉多余的层级,使得结果流变成一个扁平的结构。。

示例代码

假如,一年一班有3个兴趣小组,分别为A,B,C。每个小组的人员如下:A(小红、小白、小李),B(小白、小明),C(小红、小杨、小明)。

用两个类,一个 Group 类,一个 Child 类

@Data
@AllArgsConstructor
public  class Child{
    private String name;
}
@Data
@AllArgsConstructor
public class Group{
    private String name;
    private List<Child> children;
}

测试类

public class Test {

    public static void main(String[] args) {
        Child xiaohong = new Child("小红");
        Child xiaobai = new Child("小白");
        Child xiaoil = new Child("小李");
        Child xiaoming = new Child("小明");
        Child xiaoyang = new Child("小杨");
        Group groupA = new Group("A", Arrays.asList(xiaohong, xiaobai, xiaoil));
        Group groupB = new Group("B", Arrays.asList(xiaobai,xiaoming));
        Group groupC = new Group("C", Arrays.asList(xiaohong,xiaoyang,xiaoming));

        List<Group> class11 = new ArrayList<>();
        class11.add(groupA);
        class11.add(groupB);
        class11.add(groupC);

        System.out.println("------------测试map方法-------------");
        class11.stream()
               .map(group -> group.getChildren())
               .forEach(child -> System.out.println(child));

        System.out.println("------------测试flagMap方法-------------");
        class11.stream()
               .flatMap(group -> group.getChildren().stream())
               .forEach(child -> System.out.println(child));
    }
}

测试结果如下:

我们可以看到利用 flatMap 方法后,流中的数据被展平,消除了List<Group>的层级解构,但是 map 中的数据仍然存在层级结构。

总结

  • map:保持层级结构,每个元素被转换为一个新的元素。
  • flatMap:展平结构,将每个元素转换为一个流,并将所有这些流合并为一个扁平的流。

Tags:java8 flatmap

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言