java8中Collectors收集器的使用

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()));
    

猜你喜欢

转载自blog.csdn.net/zpflwy1314/article/details/89603414
今日推荐