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的筛选的实现方式有关

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值