Java8特性-如何理解Stream中的FlatMap
0.前言
在学习Stream的过程中,FlatMap的理解是受阻点之一,所以单独写一篇来谈谈我对FlatMap的看法。关于Stream的完整博客可以参考我的这篇Java-Stream学习笔记(上)。
在这之前,为了方便演示,写了一个实体类(包含姓名,年龄,工资属性)。
Employee:
package com.lordbao.entity;
import java.util.Objects;
/**
* @Author Lord_Bao
* @Date 2020/10/5 11:31
* @Version 1.0
*/
public class Employee {
private String username;
private int age;
private int salary;
public Employee() {
}
public Employee(String username, int age, int salary) {
this.username = username;
this.age = age;
this.salary = salary;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Employee{" +
"username='" + username + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return age == employee.age &&
salary == employee.salary &&
Objects.equals(username, employee.username);
}
@Override
public int hashCode() {
return Objects.hash(username, age, salary);
}
}
1.正文
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
。此方法是将Stream中的每个元素映射成一个流,然后将每个流的中的元素都取出来合并,然后返回合并后的新流。
按照这个逻辑将Stream中的每个元素都映射为Stream,然后将每个Stream都拆解,将拆解后的元素组装成新的Stream。貌似看起来有点模糊,不如Map好理解啊。
其实这里可以这么分析,什么元素能够映射为Stream呢?换个问题就是Stream是怎么创建的?大多数是通过集合,数组呗。那么我可不可以理解为本来的数据源就是集合或是数组,而它存储的元素恰好也是集合或是数组呢?
按照这个思路,我设计了如下的例子。
测试代码: