java8中list排序

       在项目开发中,很多页面的展示,都是按照一定的顺序排列的。
要想获取一个有序的list,有两种做法:
一、使用sql查出有序的list
       这种方式进行排序,是最常用的,取数据的时候,我就要求数据是按照一定的顺序排列的。这种方式适合简单的列表的读取,如果页面展示的list需要多个组合计算得到。那么顺序就不能够保证了
二、用java8的sort方法排序
       这种方式,对于对象类型的list排序,需要指出按照哪个字段进行排序,排序的方式是什么样的。
排序一般都会跟筛选一块用。方便得到想要的list

下面用一个例子来演示一下:

class Rule{
    public Rule(Integer code, Integer number,String remark) {
        this.code = code;
        this.number = number;
        this.remark = remark;
    }

    public Integer code;
    public Integer score;
    public Integer max;
    public Integer min;
    public Integer number;
    public String remark;
}

2.1一般的排序
举个例子

public static void main(String[] args) {
        List<Rule> lstRule = buildRuleList();

        for (int i = 0; i < lstRule.size(); i++) {
            lstRule.get(i).print();
        }


        // 定义一个比较器,用于排序
        Comparator<Rule> byNumber = Comparator.comparingInt(Rule::getNumber);

        // 获取排序后的list,先通过filter筛选,然后在排序
        List<Rule> rule = lstRule.stream().filter(s -> s.getCode() == 2).sorted(byNumber).collect(Collectors.toList());

        System.out.println("-------------------------");
        for (int i = 0; i < rule.size(); i++) {
            rule.get(i).print();
        }
    }

    private static List<Rule> buildRuleList() {
        List<Rule> lstRule = new ArrayList<>();
        lstRule.add(new Rule(1,10,"而且"));
        lstRule.add(new Rule(2,5,"给对方"));
        lstRule.add(new Rule(1,11,"多个"));
        lstRule.add(new Rule(2,1,"回复"));
        lstRule.add(new Rule(2,3,"回复水电费"));
        return lstRule;
    }

2.2复合排序

public static void main(String[] args) {
        List<Rule> lstRule = buildRuleList();

        for (int i = 0; i < lstRule.size(); i++) {
            lstRule.get(i).print();
        }


        // 联合排序
        Comparator<Rule> byNumber = Comparator.comparingInt(Rule::getNumber);
        Comparator<Rule> byCode = Comparator.comparingInt(Rule::getCode);
        Comparator<Rule> byNumberAndCode = byNumber.thenComparing(byCode);
        // byNumberAndCode是一个联合排序的比较器
        List<Rule> rule = lstRule.stream().filter(s -> s.getCode() == 2).sorted(byNumberAndCode).collect(Collectors.toList());

        System.out.println("-------------------------");
        for (int i = 0; i < rule.size(); i++) {
            rule.get(i).print();
        }
    }

       在使用这个排序方法的时候,核心的是使用stream的排序。但是在使用stream的时候有一个问题,示例如下:

Stream<Rule> stream = ruleList.stream().filter(s -> rule.getNumber().equals(s.getNumber()));
Optional<Rule> temp = stream.filter(s -> s.getNumber() == rule.getNumber()).findFirst();      //校验的数据
// 筛选之后 看还有没有数据
                    if (temp.isPresent()){
                        tempModelRule = temp.get();
                    }else {
                    //如果没有数据,在重新按照别的方式进行筛选
                        Stream<Rule> stream1 = stream.filter(s -> s -> rule.getNumber2().equals(s.getNumber2());
                        temp = stream1.sorted(byScore).findFirst();      //排序取最低分
                        tempModelRule = temp.get();
                    }

       在使用stream的时候,第一次筛选的时候,如果没有获取到想要的数据。虽然 stream没有赋值。但是再次进行筛选的时候,会报错。需要重新stream一下。可能与stream的筛选的实现方式有关

    原文作者:赵崇
    原文地址: https://blog.csdn.net/zc474235918/article/details/69484107
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞