Collectors 实现了接口 Collector<T,A,R> 收集器将strom结果进行收集
T: 需要进行reduce操作的元素类型
A:reduce操作的动态集合类型
R:reduce操作的结果类型
举例
//将名字集合到list
List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());
//将名字集合到TreeSet
Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
//将名字转换为String,并连接为一个字符串
String joined = things.stream()
.map(Object::toString)
.collect(Collectors.joining(", "));
//计算员工的工资总额
int total = employees.stream()
.collect(Collectors.summingInt(Employee::getSalary)));
//根据部门将员工分组:
Map<Department, List<Employee>> byDept
= employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
//计算不同部门的员工工资总额
Map<Department, Integer> totalByDept
= employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment,
Collectors.summingInt(Employee::getSalary)));
Collectors.groupingBy()为分组函数Collectors.groupingBy的设计语义来说了,它代表把流的数据按照一定规则进行归类分组,并要求提供同一组的数据怎么进行收集的方法,所以这就是Collectors.groupingBy两个参数的含义
Collectors.mapping为分组后,把原始对象进行转换为新的对象
Map<Integer, List<String>> collect = users.stream().collect(Collectors.groupingBy(Users::getAge, Collectors.mapping( item ->{
//当然你这里也可以构建一个新的对象,进行返回
return item.getName();
}, Collectors.toList())));
// Map<Integer, List<Object>> collect = users.stream().collect(Collectors.groupingBy(Users::getAge, Collectors.mapping(item ->{ return Arrays.asList(item); }, Collectors.toList())));
以下是一个案例:
User user1 = new User("zhangsan", 60);
User user2 = new User("lisi", 80);
User user3 = new User("zhangsan", 80);
User user4 = new User("wangwu", 50);
User user5 = new User("wangwu2", 50);
List<User> userList = Arrays.asList(user1, user2, user3, user4, user5);
//算出分数最小的那个并输出
userList.stream().collect(Collectors.minBy(Comparator.comparingInt(User::getScore))).ifPresent(System.out::println);
//算出分数最大的那个并输出(无法做到多个并列的时候求值)
Optional optional = userList.stream().collect(Collectors.maxBy(Comparator.comparingInt(User::getScore)));
//optional.isPresent(System.out::println);//isPresent是判断是否存在,不能接受参数
optional.ifPresent(System.out::println);//直接使用时ifPresent
//算出分数平均值并输出
double averagint = userList.stream().collect(Collectors.averagingInt(User::getScore));
//算出分数总和并输出
int summingInt = userList.stream().collect(Collectors.summingInt(User::getScore));
//拼接名字
String nameStrs = userList.stream().map(User::getName).collect(Collectors.joining());
//拼接名字,调用另外一个方法,可以加前缀和后缀
String nameStrs2 = userList.stream().map(User::getName).collect(Collectors.joining(", ", "[", "]"));
//分组:按照分数(返回的map的key是根据分组的条件来决定的,score是int,那么key就是Integer)
Map<Integer, List<User>> scoreUsers = userList.stream().collect(Collectors.groupingBy(User::getScore));
//二级分组:线按照分数分组,返回一个Map<Integer, List<User>>, 在根据用户名分组
Map<Integer, Map<String, List<User>>> scoreNameUsers = userList.stream().collect(Collectors.groupingBy(User::getScore, Collectors.groupingBy(User::getName)));
//分区,是否及格
Map<Boolean, List<User>> jigeUsers = userList.stream().collect(Collectors.partitioningBy(user -> user.getScore() >= 60));
//二级分区,是否及格,及格里面是否大于80
Map<Boolean, Map<Boolean, List<User>>> youxiuUsers = userList.stream().collect(Collectors.partitioningBy(user -> user.getScore() >= 60, Collectors.partitioningBy(user -> user.getScore() >= 80)));
//分区,是否及格,算出及格的个数
Map<Boolean, Long> jigeUserCount = userList.stream().collect(Collectors.partitioningBy(user -> user.getScore() >= 60, Collectors.counting()));