java8中list排序

原创 2017年04月06日 21:03:33

       在项目开发中,很多页面的展示,都是按照一定的顺序排列的。
要想获取一个有序的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的筛选的实现方式有关

版权声明:本文为博主原创文章,未经博主允许不得转载。

java8下list排序

public static void main(String[] args) { List list = Arrays.asList(2, 7, 3, 1, 8, 6, 4); list.sort...

JAVA8-用lamda表达式和增强版Comparator进行排序

以前的排序一般对象实现Comparable或者Comparator接口,经常是通过匿名类类实现。 可以参见以前的博文 Java 中 Comparable 和 Comparator 比较 现在看看使...

jdk8 list排序

//按照开始时间排序 Collections.sort(productPrices, new Comparator() { public int compare(ProductPrice ar...

Collections.sort方法排序,以及java8前后版本的使用

自己的一些总结
  • M_200
  • M_200
  • 2016年11月25日 10:19
  • 3628

Java8 利用Lambda处理List集合

Java8 Lambda表达式处理集合
  • qi_lin7
  • qi_lin7
  • 2016年10月28日 17:20
  • 19828

java8新特性-sorted排序

在排序之前,首先要搞清楚以下概念。 Stream Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iter...

java中使用sort()对ArrayList进行排序

java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将A...

JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序

大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动;但是Comparator在之前基础上增加了很多static和defau...

java 8 Lambda排序

package com.ven.java8.lambda; import java.util.Arrays; import java.util.Collections; import java.ut...

原来 Java8 Stream 中的排序是插入排序

写了小程序,验证 Java8 Steam sort是如何实现 package com.pnp.tryJ8col; import java.util.Arrays; import java.uti...
  • span76
  • span76
  • 2016年08月25日 16:09
  • 6913
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java8中list排序
举报原因:
原因补充:

(最多只允许输入30个字)