java8 Collectors 基本使用

Collectors 基本使用

首先我们先了解一下,Collectors可以帮我们完成的事情,例如:分组、排序(支持多字段排序)、最大值、最小值、平均值,简单的来说,以前我们在数据上面用sql 去完成的聚合相关的操作,Collectors 都可以完成。ps:刚刚开始尝试写一些原创文章,写的不好,请大家见谅~

先准备数据

    private List<String> list = new ArrayList<>();

    List<Users> users;

    @Before
    public void load() {
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");

        users = Arrays.asList(new Users(1, "张三", 18),
                new Users(2, "李四", 30),
                new Users(3, "王五", 20),
                new Users(4, "赵六", 18));

    }

分组

    @Test
    public void groupingBy() {
        users.stream().collect(Collectors.groupingBy(Users::getAge)).forEach((key, value) -> {
            System.out.println(key + "  ---" + value);
        });

    }

分组,然后取最大的值

  
    @Test
    public void groupingByMax() {

        //分组后去最大值
        Map<Integer, Optional<Users>> collect = users.stream().collect(Collectors.groupingBy(Users::getAge, Collectors.maxBy(Comparator.comparing(Users::getId))));

        //分组后去最小值
        Map<Integer, Optional<Users>> collect2 = users.stream().collect(Collectors.groupingBy(Users::getAge, Collectors.minBy(Comparator.comparing(Users::getId))));

        collect.forEach((key, value) -> {
            System.out.println("key " + key + "          " + "value : " + value);
        });


        System.out.println("---------------------");

        collect2.forEach((key, value) -> {
            System.out.println("key " + key + "          " + "value : " + value);
        });

    }

分组后,把原始对象进行转换为新的对象

    @Test
    public void 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())));

        collect.forEach((key, value) -> {
            System.out.println("key : " + key + "value :" + value);
        });
    }

单字段进行排序


    /**
     * 单字段进行排序
     */
    @Test
    public void sort() {

        //倒序
        System.out.println("倒序");
        users.stream().sorted(Comparator.comparing(Users::getAge).reversed()).collect(Collectors.toList()).forEach(item -> {
            System.out.println(item.getAge());
        });

        System.out.println("升序");

        //升序
        users.stream().sorted(Comparator.comparing(Users::getAge)).collect(Collectors.toList()).forEach(item -> {
            System.out.println(item.getAge());
        });

    }

结果

image.png

多字段进行排序(comparator)


     /**
     * 排序 、多条件排序,注意事项,排序的字段不能为空
     */
    @Test
    public void comparator() {

        /**
         *
         * 手动控制排序(复杂业务的时候,可以采用该种方法)
         * 1、年龄倒叙
         * 2、id 升序
         *
         */
        Comparator<Users> usersComparator = Comparator.comparing(Users::getAge, (o1, o2) -> {
            //  倒叙
            return o2.compareTo(o1);
        }).thenComparing(Users::getId, (o1, o2) -> {
            // 升序
            return o1.compareTo(o2);
        });
        List<Users> collect = users.stream().sorted(usersComparator).collect(Collectors.toList());

        collect.forEach(item -> {
            System.out.println(item);
        });

        System.out.println("----------------------------------");

        /**
         *
         * 第二种排倒序方法
         * Comparator.reverseOrder 倒叙
         * Comparator.naturalOrder 升叙
         *
         * 1、年龄倒叙
         * 2、id 倒序
         *
         */
        Comparator<Users> usersComparator2 = Comparator.comparing(Users::getAge, Comparator.reverseOrder()).thenComparing(Users::getId,Comparator.reverseOrder());
        List<Users> collect2 = users.stream().sorted(usersComparator2).collect(Collectors.toList());

        collect2.forEach(item -> {
            System.out.println(item);
        });

    }

结果:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Int Double Long 设置特定的stream类型, 提高性能,增加特定的函数 无存储。stream不是一...
    patrick002阅读 1,342评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,001评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,812评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,979评论 11 349
  • 诚然,时间是个好东西,它可以给我滋养,给我雨露,给我营养,令我漫过青葱岁月踏入中年队伍。 十年,就是这么看似漫长实...
    WendyKoo阅读 757评论 0 2

友情链接更多精彩内容