一个示例带你掌握Java Stream中的FlatMap

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 串行合并成一条

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值