Java8 Stream流如何操作集合,一文带你了解!
一、基本介绍
概念:Stream是Java8 API的新成员,它允许以声明性的方式处理数据集合。 特点:1.代码简明
:函数式编程写出的代码简洁且意图明确,是用stream接口让你从此告别for循环。2.多核友好
:Java函数式编程使得编写并运行程序更简单,需要的都是调用方法 流程:1.把集合转换为stream
2.操作stream
:stream流在管道中经过中间操作符的处理,最后由最终操作得到前面处理的结果
二、常用集合操作
-- 取出集合中对象的指定值-不去重
List ageList=userList.stream().map(User::getAge).collect(Collectors.toList());
-- 取出集合中对象的指定值-并去重
List ageDistinct=userList.stream().map(User::getAge).collect(Collectors.toList())
.stream().distinct().collect(Collectors.toList());
-- 取出对象中字段等于指定值的 数据
List age12List=userList.stream().filter(user ->user.getAge().equals("12")).collect(Collectors.toList());
-- 以对象中的指定值分组
Map> ageMap=userList.stream().collect(Collectors.groupingBy(User::getAge));
-- 以指定字段排序
List sortAscUserList = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
List sortDescUserList = userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
-- 取出对象指定字段的最大值
int maxAge = userList.stream().mapToInt(user -> Integer.valueOf(user.getAge())).max().getAsInt();
-- List集合中Map对象
List> userList=new ArrayList<>();
Map user1=new HashMap<>();
user1.put("name","A");user1.put("age","12");userList.add(user1);
Map user2=new HashMap<>();
user2.put("name","B");user2.put("age","13");userList.add(user2);
Map user3=new HashMap<>();
user3.put("name","B");user3.put("age","12");userList.add(user3);List ageList=userList.stream().map(user->user.get("age")).collect(Collectors.toList());
三、操作符
Java Stream的操作符可以分为中间操作符
合终止操作符
两种
3.1 中间操作符
流方法 含义 filter 用于通过设置的条件过滤元素 distinct 返回一个元素各异(根据元素流所生成元素的hashCode()和equals方法实现)的流 limit 返回一个不超过指定长度的流 skip 返回一个扔掉前n个元素的流 sort 返回排序后的流 map 返回由给定函数应用于此流的元素的结果组成的流
-- filter
List list= Arrays.asList("abc","ab","","","fg",null);
List notNullList = list.stream().filter(str -> StringUtils.isNotBlank(str)).collect(Collectors.toList());
System.out.println(notNullList);
--输出[abc, ab, fg]List containsList = list.stream().filter(str -> StringUtils.isNotBlank(str) && str.contains("a")).collect(Collectors.toList());
System.out.println(containsList);
--输出[abc, ab]
-- distinct
List list= Arrays.asList("abc","ab","ab");
List distinctList = list.stream().distinct().collect(Collectors.toList());
System.out.println(distinctList);
--输出[abc, ab]
-- limit
List list= Arrays.asList("abc","ab","ab");
List limitList = list.stream().limit(2).collect(Collectors.toList());
System.out.println(limitList);
--输出[abc, ab]
-- skip
List list= Arrays.asList("abc","ab","ab");
List limitList = list.stream().skip(2).collect(Collectors.toList());
System.out.println(limitList);
-- 输出 [ab]
-- sort
List list= Arrays.asList("1","3","2");
List sortList = list.stream().sorted().collect(Collectors.toList());
System.out.println(sortList);
--输出[1, 2, 3]
-- map
List list= Arrays.asList("abc","ab","ab");
List mapList = list.stream().map(str->"case_"+str).collect(Collectors.toList());
System.out.println(mapList);
--输出[case_abc, case_ab, case_ab]
3.2 终止操作符
流方法 含义 anyMatch 集合中是否有一个元素满足条件 allMatch 集合中元素是否都满足条件 noneMatch 集合中元素是否都不满足条件 findFirst 返回流的第一个对象的Optional collect 收集器 将流转换为其他形式 count 返回流元素个数
-- anyMatch
List list= Arrays.asList("abc","ab","","","fg",null);
boolean flag = list.stream().anyMatch(str -> str == null);
System.out.println(flag);
-- 输出 true
-- allMatch
List list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().allMatch(str -> str != null));
-- 输出 true
-- noneMatch
List list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().noneMatch(str -> str == null));
-- 输出 true
-- findFirst
List list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().findFirst().get());
-- 输出 abc
-- collect
List list= Arrays.asList("abc","ab","","","fg");
List collectList = list.stream().collect(Collectors.toList());
System.out.println(collectList);
-- 输出 [abc, ab, , , fg]
-- count
List list= Arrays.asList("abc","ab","","","fg");
System.out.println(list.stream().count());
-- 输出5
System.out.println(list.stream().filter(str-> StringUtils.isNotBlank(str)).count());
-- 输出3