Java Stream「FlatMap」
我们可以通过下面的例子来更好的理解flatmap的使用
首先定义两个类型
/**
* 学生类
*/
@Data
@AllArgsConstructor
public static class Student{
/**
* 姓名
*/
private String name;
}
/**
* 班级类
*/
@Data
@AllArgsConstructor
public static class MainClass{
/**
* 小组
*/
private List<Student> group;
}
可以看到班级类中包含了小组,而小组是由学生组成,每个学生拥有自己的姓名
接下来我们创建两个小组
List<Student> groupList = Arrays.asList(
new Student("mike"), new Student("lee"), new Student("jack"));
List<Student> groupList02 = Arrays.asList(
new Student("peter"), new Student("pony"));
创建一组MainClass对象
List<MainClass> classList = Arrays.asList(new MainClass(groupList),new MainClass(groupList02));
如果我们想将这两个班中所有的学生都取出来放进一个ArrayList中,我们该如何操作呢❓
首先我们尝试用map操作
List<List<Student>> result = classList.stream().map(MainClass::getGroup).collect(Collectors.toList());
然而得到的结果却不是我们想要的,虽然我们可以通过for-each循环去遍历得到classList中的学生
ArrayList<Student> result2 = Lists.newArrayList();
for (MainClass mainClass:classList){
result2.addAll(mainClass.getGroup());
}
我相信不熟悉flatmap的同学可能都会选择上面的方法,那么我们是否可以用一句代码就实现上面的功能呢?
//一行代码实现
List<Student> result3 = classList.stream().flatMap(c -> c.getGroup().stream()).collect(Collectors.toList());
可以看出flatmap通过接收一个lambda表达式函数 把所有返回的stream合并(这要求函数的返回值必须是一个stream的类型)从而通过一句代码实现了上述的需求
flatmap看字面意思就是将元素拍平拍扁 ,将拍扁的元素重新组成Stream,并将这些Stream 串行合并成一条