[Stream使用(一)]对实体类集合按多字段进行排序(包括集合中该字段为null的对象)

Stream排序的api的真是简洁好用!

先说结论:

  • Stream表达式可以对集合根据某个字段进行排序且默认为升序,而为null的对象会放在最后。
  • 支持多字段排序
  • 要想降序排序且null还是在最后,可构造nullsFirst认为先把null放在前面,再构造reversed()反转则null还是在集合的最后,并且集合是按照这个字段降序排序了
  • 以1个字段排序时有2种写法是因为注意是Comparator构造地不同!=>所以写代码点点点的时候注意.reversed()这个函数的位置
  • 如果在多字段的整个Comparator外面则会整体倒序!=> 所以推荐使用上面第一种写法不然多条件时候会将整个链表表反转。

测试类如下(自己测试直接复制即可)

package com;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class StreamOrderTest {
    public static void main(String[] args) {
        User user1 = new User("a",10,999.0);
        User user2 = new User("b",11,300.0);
        User user3 = new User("c",12,null);
        User user4 = new User("d",null,100.0);
        List<User> list = new ArrayList<>();
        list.add(new User("b",11,100.0));
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);
        list.add(new User("e",null,200.0));
        list.add(new User("e",null,50.0));
        System.out.println("原始集合:");
        list.forEach(System.out::println);


        //1、对年龄进行升序排序,并且age为null的对象会放到最后
        List<User> ageOrderList = list.stream().sorted(
                Comparator.comparing(User::getAge, Comparator.nullsLast(Integer::compareTo)))
                .collect(Collectors.toList());
        System.out.println("ageOrderList:");
        ageOrderList.forEach(System.out::println);

        //2、对年龄进行降序排序,并且age为null的对象会放到最后(注意这里用的是nullsFirst即代表把null值放在前面)
        List<User> ageOrderDescList = list.stream().sorted(
            Comparator.comparing(User::getAge,Comparator.nullsFirst(Integer::compareTo)).reversed())
            .collect(Collectors.toList());
        System.out.println("ageOrderDescList:");
        ageOrderDescList.forEach(System.out::println);

        //2、对年龄进行降序排序,并且age为null的对象会放到最后 第二种写法(注意这里 .reversed()的位置与上一个写法不同)
        // 
        List<User> ageOrderDescList2 = list.stream().sorted(
            Comparator.comparing(User::getAge,Comparator.nullsFirst(Integer::compareTo).reversed()))
            .collect(Collectors.toList());
        System.out.println("ageOrderDescList2:");
        ageOrderDescList2.forEach(System.out::println);

        //3、对年龄进行升序排序,并且age为null的对象会放到最后 再对财富进行排序(包括年龄为null的那些对象)
        List<User> ageWealthOrderList = list.stream().sorted(
            Comparator.comparing(User::getAge, Comparator.nullsLast(Integer::compareTo))
                    .thenComparing(User::getWealth, Comparator.nullsLast(Double::compareTo).reversed()))
            .collect(Collectors.toList());
        System.out.println("ageWealthOrderList:");
        ageWealthOrderList.forEach(System.out::println);    }

    static class User{
        private String name;
        private Integer age;
        private Double wealth;

        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }

        public User(String name, Integer age, Double wealth) {
            this.name = name;
            this.age = age;
            this.wealth = wealth;
        }

        // name等3个字段的GET SET方法

        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", wealth=" + wealth +
                    '}';
        }
    }
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值