JDK 1.8 Lambda分组排序、排序分组

一、简单说一下JDK 1.8 Lambda

JDK1.8概述:JDK1.8,又称之为Java 8(我习惯叫它为JDK1.8,后续统一叫做JDK1.8),是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布,它支持函数式编程,新的JavaScript引擎,新的日期API,新的Stream API等。

JDK1.8相比1.7之前版本,有以下几方面的优化:

  1. Lambda表达式
  2. 函数式接口
  3. 方法引用和构造器调用
  4. Stream API
  5. 接口中的默认方法和静态方法
  6. 新时间日期API

二、言归正传,上干货

1. 准备数据

先准备一个list,list中是一个个map对象,包含学生的编号(no)、姓名(name)、班级(class)

static List<Map<String, Object>> list = new ArrayList<>();

    static {
        list.add(new HashMap() {{
            put("no", 4);
            put("name", "小米");
            put("class", "二班");
        }});
        list.add(new HashMap() {{
            put("no", 3);
            put("name", "小红");
            put("class", "一班");
        }});
        list.add(new HashMap() {{
            put("no", 2);
            put("name", "小丽");
            put("class", "二班");
        }});
        list.add(new HashMap() {{
            put("no", 1);
            put("name", "小明");
            put("class", "一班");
        }});
    }

2. 按照班级(class)分组简单分组

public static void group() {
        Map<String, List<Map<String, Object>>> classMap = list.stream().collect(Collectors.groupingBy(m -> m.get("class").toString()));
        //打印结果验证
        for (Map.Entry<String, List<Map<String, Object>>> item : classMap.entrySet()) {
            String key = item.getKey();
            System.err.println("班级:" + key);
            List<Map<String, Object>> list0 = item.getValue();
            for (Map<String, Object> map : list0) {
                System.err.println(Jsons.toJSONString(map));
            }
        }
        System.err.println("=====================================================");
    }

3. 按照编号(no)正序排序

public static void order() {
        List<Map<String, Object>> list = Test.list.stream().sorted((m1, m2) -> {
            return m1.get("no").toString().compareTo(m2.get("no").toString());
        }).collect(Collectors.toList());
        //打印结果验证
        for (Map<String, Object> map : list) {
            System.err.println(Jsons.toJSONString(map));
        }
        System.err.println("=====================================================");
    }

3. 按照班级分组,并组内按照编号(no)正序排序

 public static void groupOrder() {
        Map<String, List<Map<String, Object>>> classMap = list.stream().sorted((m1, m2) -> {
            return m1.get("no").toString().compareTo(m2.get("no").toString());
        }).collect(Collectors.groupingBy(m -> m.get("class").toString()));
        //打印结果验证
        for (Map.Entry<String, List<Map<String, Object>>> item : classMap.entrySet()) {
            String key = item.getKey();
            System.err.println("班级:" + key);
            List<Map<String, Object>> list0 = item.getValue();
            for (Map<String, Object> map : list0) {
                System.err.println(Jsons.toJSONString(map));
            }
        }
        System.err.println("=====================================================");
    }

4. 按照班级(class)分组倒序,并组内按编号(no)倒序

public static void reverseGroupOrder() {
        LinkedHashMap<String, List<Map<String, Object>>> classMap = list.stream().sorted((m1, m2) -> {
            int v1 = m2.get("class").toString().compareTo(m1.get("class").toString());
            if (v1 != 0)
                return v1;
            int v2 = m2.get("no").toString().compareTo(m1.get("no").toString());
            return v2;
        }).collect(Collectors.groupingBy(m -> m.get("class").toString(), LinkedHashMap::new, Collectors.toCollection(ArrayList::new)));
        //打印结果验证
        for (Map.Entry<String, List<Map<String, Object>>> item : classMap.entrySet()) {
            String key = item.getKey();
            System.err.println("班级:" + key);
            List<Map<String, Object>> list0 = item.getValue();
            for (Map<String, Object> map : list0) {
                System.err.println(Jsons.toJSONString(map));
            }
        }
        System.err.println("=====================================================");
    }

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×