关于stream的flatMap方法简单使用

简述
在JDK8开始,列表操作新增了一新特性Stream流式操作,Stream中提供了非常多的API供大家使用,灵活的使用这些API,可以非常的方便且优美的实现我们的代码逻辑;

其中,flatMap()方法也是其中的API,flatMap()简单来说就是将多个stream流合并成一个stream,当然你也可以在合并的时候结合其他的API做一些过滤或者转换之类的,如filter,下面详细阐述一下。

案例
1、先来一个简单的使用案例:

   

public static void main(String[] args) {
        List<List<Integer>> lists = new ArrayList<>();
        List<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(3);
        arrayList.add(22);
        arrayList.add(11);
        arrayList.add(44);
        arrayList.add(null);
        arrayList.add(4);
        lists.add(arrayList);
        List<Integer> arrayList2 = JSON.parseArray(JSON.toJSONString(arrayList), Integer.class);
        arrayList2.add(55);
        lists.add(arrayList2);
        List<Integer> arrayList3 = JSON.parseArray(JSON.toJSONString(arrayList), Integer.class);
        arrayList3.add(99);
        arrayList3.add(-2);
        lists.add(arrayList3);
      //将子集合抽上来形成一个大集合
        List<Integer> collect = lists.stream().flatMap(item -> item.stream().filter(Objects::nonNull))
                .collect(Collectors.toList());
        System.out.println(collect);
    }



//输出:[1, 3, 22, 11, 44, 4, 1, 3, 22, 11, 44, 4, 55, 1, 3, 22, 11, 44, 4, 99, -2]

如上,除了我判空的处理,其他子元素按先后顺序进入到大集合里;

2、当然也可以直接对收集后的大集合做更多操作,如过滤元素:

   

public static void main(String[] args) {
        List<List<Integer>> lists = new ArrayList<>();
        List<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(3);
        arrayList.add(22);
        arrayList.add(11);
        arrayList.add(44);
        arrayList.add(null);
        arrayList.add(4);
        lists.add(arrayList);
        List<Integer> arrayList2 = JSON.parseArray(JSON.toJSONString(arrayList), Integer.class);
        arrayList2.add(55);
        lists.add(arrayList2);
        List<Integer> arrayList3 = JSON.parseArray(JSON.toJSONString(arrayList), Integer.class);
        arrayList3.add(99);
        arrayList3.add(-2);
        lists.add(arrayList3);
        Set<Integer> set = new HashSet<>();
        List<Integer> collect = lists.stream().flatMap(item -> item.stream().filter(Objects::nonNull))
          //注意:此filter是大集合上      
          .filter(one -> one > 5)
          .filter(one -> {
                    if (!set.contains(one)) {
                        set.add(one);
                        return true;
                    } else {
                        return false;
                    }
                }).collect(Collectors.toList());
        System.out.println(collect);
    }
    //输出:[22, 11, 44, 55, 99]

3: 集合对象操作

if (CollectionUtil.isNotEmpty(categoryLevel1Id) && CollectionUtil.isNotEmpty(categoryLevel2Id)) {
			//过滤出对应的一级类目
			goodsCategoryVOList = goodsCategoryVOList.stream().filter(categoryVo -> categoryLevel1Id.contains(categoryVo.getId())
				&& CollectionUtil.isNotEmpty(categoryVo.getChildren())).collect(Collectors.toList());

			//再过滤对应的二级类目
			goodsCategoryVOList = goodsCategoryVOList.stream().flatMap(categoryVo -> categoryVo.getChildren().stream())
				.filter(categoryVo2 -> categoryLevel2Id.contains(categoryVo2.getId())).collect(Collectors.toList());
		}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值