zoukankan      html  css  js  c++  java
  • 02Java8集合新特性

    Java8 List集合 和 Map集合使用

    List新特性使用

    List分组功能使用

    • 创建对象
    /**
     * @author mazhiyuan
     * @date 2022/01/07
     */
    @Data
    @AllArgsConstructor
    class User {
        private String name;
        private String sex;
        private String grade;
    }
    
    • 测试分组功能
        /**
         *groupingList
         */
        private static void groupingList() {
    
            //1.模拟数据
            List<User> users = new ArrayList<>();
            users.add(new User("小明", "男", "1班"));
            users.add(new User("小红", "女", "1班"));
            users.add(new User("小张", "男", "2班"));
            users.add(new User("小兰", "女", "1班"));
            users.add(new User("小紫", "女", "2班"));
    
            //2.根据性别进行分组
            // 核心代码(返回Map集合,key就是分组的属性,value就是分组后的集合)
            Map<String, List<User>> userMap = users.stream().collect(Collectors.groupingBy(User::getSex));
            System.out.println(userMap);
        }
    

    嵌套分组

        /**
         *ingInnerList
         */
        private static void ingInnerList() {
            //1.模拟数据
            List<User> users = new ArrayList<>();
            users.add(new User("小明", "男", "1班"));
            users.add(new User("小红", "女", "1班"));
            users.add(new User("小张", "男", "2班"));
            users.add(new User("小兰", "女", "1班"));
            users.add(new User("小紫", "女", "2班"));
    
            //2.根据性别进行分组
            // 核心代码(返回Map集合,也是嵌套的,最外层key就是sex,内层map的key是grade)
            Map<String,Map<String,List<User>>> userMap = users.stream().collect(Collectors.groupingBy(User::getSex,Collectors.groupingBy(User::getGrade)));
            System.out.println(userMap);
    
        }
    

    List排序

    • 简单的排序方法
        private static void simpleSort() {
    
            //1.数据模拟(Integer继承了比较接口)
            List<Integer> list = new ArrayList<Integer>();
            list.add(new Integer(3));
            list.add(new Integer(14));
            list.add(new Integer(6));
            list.add(new Integer(10));
    
            //2.使用Collections进行排序
            Collections.sort(list);
            System.out.println(list.toString());
        }
    
    
    • 继承Comparable接口
    //用户类
    @Data
    @AllArgsConstructor
    class User implements Comparable<User>{
        private String name;
        private String sex;
        private String grade;
        private Integer age;
    
        @Override
        public int compareTo(User user) {
        // 重写Comparable接口的compareTo方法,根据年龄升序排列,降序修改相减顺序即可
        return this.age - user.getAge();
        }
    }
    
        /**
         *继承comparable接口
         */
        private static void comparableSort() {
    
            //1.模拟数据
            List<User> users = new ArrayList<>();
            users.add(new User("小兰", "女", "1班", 4));
            users.add(new User("小紫", "女", "2班", 5));
            users.add(new User("小明", "男", "1班", 1));
            users.add(new User("小红", "女", "1班", 2));
            users.add(new User("小张", "男", "2班", 3));
    
            //2.使用Collections进行排序
            Collections.sort(users);
            System.out.println(users.toString());
        }
    
    • 使用匿名内部类重写Comparator方法实现排序
        private static void newComparatorSort() {
    
            //1.模拟数据
            List<User> users = new ArrayList<User>();
            users.add(new User("小兰", "女", "1班", 4));
            users.add(new User("小紫", "女", "2班", 5));
            users.add(new User("小明", "男", "1班", 1));
            users.add(new User("小红", "女", "1班", 2));
            users.add(new User("小张", "男", "2班", 3));
    
            //2.排序
            Collections.sort(users, new Comparator<User>() {
                @Override
                public int compare(User u1, User u2) {
                    int diff = u1.getAge() - u2.getAge();
                    if (diff > 0) {
                        return 1;
                    } else if (diff < 0) {
                        return -1;
                    }
                    return 0; //相等为0
                }
            }); // 按年龄排序
            System.out.println(users.toString());
        }
    
    
    • 使用Comparator.comparing简单排序
        private static void comparingSort() {
            //1.模拟数据
            List<User> users = new ArrayList<User>();
            users.add(new User("小兰", "女", "1班", 4));
            users.add(new User("小紫", "女", "2班", 5));
            users.add(new User("小明", "男", "1班", 1));
            users.add(new User("小红", "女", "1班", 2));
            users.add(new User("小张", "男", "2班", 3));
    
            //2.排序
            users.sort(Comparator.comparing(User::getAge));
            System.out.println(users.toString());
    
        }
    
    • 使用Comparator.comparing升序/降序 以及多字段排序

      单字段

    List<类> list; 代表某集合
     
    //返回 对象集合以类属性一升序排序
    list.stream().sorted(Comparator.comparing(类::属性一));
     
    /**
    * 返回 对象集合以类属性一降序排序 注意两种写法
    **
    //先以属性一升序,结果进行属性一降序
    list.stream().sorted(Comparator.comparing(类::属性一).reversed());
    //以属性一降序 
    list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()));
    

    ​ 多字段

    // 返回 对象集合以类属性一升序 属性二升序
    list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二));
     
    
    //先以属性一升序,升序结果进行属性一降序,再进行属性二升序
     list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二));
     
    //先以属性一降序,再进行属性二升序
    list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()).thenComparing(类::属性二));
     
    /**
    * 返回 对象集合以类属性一降序 属性二降序 注意两种写法
    **/
     
    //先以属性一升序,升序结果进行属性一降序,再进行属性二降序
    list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二,Comparator.reverseOrder()));
    //先以属性一降序,再进行属性二降序
    list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()).thenComparing(类::属性二,Comparator.reverseOrder()));
     
    /**
    * 返回 对象集合以类属性一升序 属性二降序 注意两种写法
    **/
     
    //先以属性一升序,升序结果进行属性一降序,再进行属性二升序,结果进行属性一降序属性二降序 
    list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二).reversed());
     
    //先以属性一升序,再进行属性二降序 
    list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二,Comparator.reverseOrder()));
    

    升序/降序

            List<User> users = new ArrayList<User>();
            users.add(new User("小兰", "女", "1班", 4));
            users.add(new User("小紫", "女", "2班", 5));
            users.add(new User("小明", "男", "1班", 1));
            users.add(new User("小红", "女", "1班", 2));
            users.add(new User("小张", "男", "2班", 3));
    //        users.sort(Comparator.comparing(User::getAge).reversed());
            users.sort(Comparator.comparing(User::getAge, Comparator.reverseOrder()));
            System.out.println(users.toString());
    

    注意点:

    写法一: Comparator.comparing(类::属性一).reversed();

    写法二: Comparator.comparing(类::属性一,Comparator.reverseOrder());

    两种排序是完全不一样的,一定要区分开来。

    写法一是得到排序结果后再排序;

    写法二是直接进行排序,很多人会混淆导致理解出错,但写法二更好理解,建议使用写法二

    排序总结:

    排序算法本质使用的是

    • 希尔排序(插入排序的改进算法)
    • 归并排序


    基本数组类型转换Lits集合

    代码实现

    package com.arithmetic;
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class Solution {
        public static void main(String[] args) {
            // int 类型
            int[] ints = {1, 2, 3, 4, 5};
            List<Integer> list1 = Arrays.stream(ints).boxed().collect(Collectors.toList());
            System.out.println(list1);
            // double 类型
            double[] doubles = {1.0, 2.0, 3.0, 4.0, 5.0};
            List<Double> list2 = Arrays.stream(doubles).boxed().collect(Collectors.toList());
            System.out.println(list2);
            // String 类型
            String[] strs = {"1", "2", "3", "4", "5"};
            List<String> list3 = Arrays.stream(strs).collect(Collectors.toList());
            System.out.println(list3);
            System.out.println(Arrays.asList(strs));
    
        }
    }
    
  • 相关阅读:
    UG二次开发-CAM-获取修改路径参数
    多线程01
    MFC的对话框使用Scintilla
    CATIA的后处理
    win32窗体中使用Scintilla窗体
    string的reserve和resize
    前端宝典
    MarkDown学习
    JAVA中构造方法总结
    IDEA中maven和tomcat的配置
  • 原文地址:https://www.cnblogs.com/mzyc/p/15797501.html
Copyright © 2011-2022 走看看