网站首页 > 精选文章 / 正文
前言
在 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
猜你喜欢
- 2025-01-09 精通Spring Boot 3 : 9. Spring Boot 安全 (3)
- 2025-01-09 精通Spring Boot 3 : 7. Spring Boot 响应式 (1)
- 2025-01-09 别挠了,都快秃了,双因素认证我直接告诉你算了
- 2025-01-09 java8-Optional类使用介绍
- 2025-01-09 Java 中的 Optional
- 2025-01-09 知识总结-Java开发指Optional详解
- 2025-01-09 精通Spring Boot 3 : 7. Spring Boot 响应式 (2)
- 2025-01-09 读图数据库实战笔记08遍历与子图
- 2025-01-09 Java8中的Stream API详细分析
- 2025-01-09 学习Java 8 Stream Api (2) - Stream的中间操作