关于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]
当然如果子元素是实体类对象,你还可以做更多操作。 好了,今天分享到这,各位道友有啥分享的可以直接留言交流!!!