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