中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java怎么使用stream對日期排序

發布時間:2023-04-25 17:52:14 來源:億速云 閱讀:200 作者:iii 欄目:開發技術

本篇內容主要講解“java怎么使用stream對日期排序”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java怎么使用stream對日期排序”吧!

    java使用stream對日期排序

    主要講解Stream對日期字段進行排序時的寫法,以及當日期字段為null時的排序策略。或者對多個屬性進行排序時的案例

    Stream對對象中的某個日期屬性進行排序

    Student對象

    import lombok.Data;
    import java.util.Date;
    
    @Data
    public class Student {
        private String name;
        private int age;
        private Date birthday;
    
        public Student(String name, int age,Date birthday) {
            this.name = name;
            this.age = age;
            this.birthday = birthday;
        }
    }
    List<Student> list = new ArrayList<>();
    Student s1 = new Student("a", 11, new Date(2020, 1, 1));
    Student s2 = new Student("b", 12, new Date(2020, 1, 2));
    Student s3 = new Student("c", 13, new Date(2020, 1, 3));
    list.add(s1);
    list.add(s2);
    list.add(s3);
    
    list = list.stream().sorted(Comparator.comparing(Student::getBirthday)).collect(Collectors.toList());

    注意:當birthday日期屬性為空時,再使用Comparator.comparing排序會報空指針異常,此時需要指定策略,即當日期為空時排在最前面或排在最后面。

    對日期屬性進行排序,并指定日期為空時的策略

    List<Student> list = new ArrayList<>();
    Student s1 = new Student("a", 11, new Date(2020, 1, 1));
    Student s2 = new Student("b", 12, new Date(2020, 1, 2));
    Student s3 = new Student("c", 13, null);
    list.add(s1);
    list.add(s2);
    list.add(s3);
    
    list = list.stream().sorted(Comparator.comparing(Student::getBirthday,Comparator.nullsFirst(Comparator.naturalOrder()))).collect(Collectors.toList());
    
    System.out.println(list);

    執行結果:

    [Student(name=c, age=13, birthday=null), Student(name=a, age=11, birthday=Sun Feb 01 00:00:00 CST 3920), Student(name=b, age=12, birthday=Mon Feb 02 00:00:00 CST 3920)]

    排序策略

    nullsFirst():為空時排在最前面

    此方法返回比較器,其是空型比較,并認為空值小于非空。null首先通過以下邏輯進行操作:

    • 1.null元素被認為小于non-null(即值是null的小于非空的)。

    • 2.當兩個元素都為空時,則認為它們相等。

    • 3.當兩個元素都不為空時,指定的Comparator確定順序。

    • 4.如果指定的比較器為null,則返回的比較器將所有非null元素視為相等。

    • 5.如果指定的比較器可序列化,則返回的比較器可序列化。

    nullsLast():為空時排在最后面

    方法返回比較器,其是空型比較,并認為比非空更大空值。null首先通過以下邏輯進行操作:

    • 1.null元素被認為大于非null。

    • 2.當兩個元素都為空時,則認為它們相等。

    • 3.當兩個元素都不為空時,指定的Comparator確定順序。

    • 4.如果指定的比較器為null,則返回的比較器將所有非null元素視為相等。

    • 5.如果指定的比較器可序列化,則返回的比較器可序列化。

    Comparator.naturalOrder 和 Comparator.reverseOrder

    很多時候我們會面臨這樣的場景,那就是排序邏輯不變,一會兒根據升序排序,一會根據降序排序,這個時候如果我們的Comparable 中的排序邏輯可以滿足上面的排序,就是排序類型(升序還是降序)是不滿足的,這個時候我們就可以配合Comparator,來改變原來默認的排序類型(其實就是升序)

    nullsFirst與naturalOrder的結合使用

    如下示例:當字段為空時排在最前面,剩下的升序排列

    List<Student> list = new ArrayList<>();
    Student s1 = new Student("a", 11, new Date(2020, 1, 1));
    Student s2 = new Student("b", 12, new Date(2020, 1, 2));
    Student s3 = new Student("c", 13, null);
    list.add(s1);
    list.add(s2);
    list.add(s3);
    
    list = list.stream().sorted(Comparator.comparing(Student::getBirthday,Comparator.nullsFirst(Comparator.naturalOrder()))).collect(Collectors.toList());
    Comparator.nullsFirst(Comparator.naturalOrder()))
    • 空值放前面,剩下的升序排序

    Comparator.nullsFirst(Comparator.reverseOrder()))
    • 空值放前面,剩下的倒敘排序

    Comparator.nullsLast(Comparator.naturalOrder()))
    • 空值放最后,剩下的升序排序

    Comparator.nullsLast(Comparator.reverseOrder()))
    • 空值放最后,剩下的倒敘排序

    對象中的多個屬性進行排序

    先根據生日排序,再根據年齡排序

    List<Student> list = new ArrayList<>();
    Student s1 = new Student("a", 11, new Date(2020, 1, 1));
    Student s2 = new Student("b", 12, new Date(2020, 1, 2));
    Student s3 = new Student("c", 13, null);
    Student s4 = new Student("d", 13, null);
    list.add(s1);
    list.add(s2);
    list.add(s3);
    list.add(s4);
    
    list = list.stream().sorted(Comparator.comparing(Student::getBirthday,Comparator.nullsFirst(Comparator.naturalOrder())).thenComparing(Student::getAge)).collect(Collectors.toList());
    System.out.println(list);

    字符串日期排序

    寫法一

    //DateUtil.convertStringToDate為自封裝的一個String轉Date的方法
    List<String> maxUpdateTime = updateTimeList.stream().sorted(Comparator.comparing(s -> DateUtil.convertStringToDate(s.toString(),"yyyy-MM-dd HH:mm:ss").getTime()).reversed()).collect(Collectors.toList());

    寫法二:

    List<String> maxUpdateTime = updateTimeList.stream().sorted(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            try {
                Date d1 = DateUtil.convertStringToDate(o1, "yyyy-MM-dd HH:mm:ss");
                Date d2 = DateUtil.convertStringToDate(o2, "yyyy-MM-dd HH:mm:ss");
                //正序
                //return d1.compareTo(d2);
                //倒序
                return d2.compareTo(d1);
            } catch (Exception e) {
                e.printStackTrace();
            }
                return 0;
        }
    }).collect(Collectors.toList());

    對字段進行排序,考慮空值的其他寫法

    /* 請注意,根據單屬性name進行排序,若需要將name為null的對象也參與排序,則需要:
    * .sorted(Comparator.comparing(User::getName, Comparator.nullsLast((o1,o2)->o1.compareTo(o2))))
    * 使用方法引用優化(注意name的類型是String)即為:
    * .sorted(Comparator.comparing(User::getName, Comparator.nullsLast(String::compareTo)))
    */
     
    voList = voList.stream().sorted(Comparator.comparing(User::getUserName,Comparator.nullsLast(String::compareTo))) .collect(Collectors.toList());

    java stream流排序失效的記錄

    strings.parallelStream().filter(s -> s.length() != 2).map(s -> s + "w").sorted((x, y) -> y.length() - x.length()).collect(Collectors.joining(","));

    根據排序結果來看,不只是順序沒有按照傳入的lambda表達式來排序,甚至每次排序結果都是不同的,后發現這里使用排序的話,就不可以使用并行流來進行操作,應當使用串行流。

    如下:

    strings.stream().filter(s -> s.length() != 2).map(s -> s + "w").sorted((x, y) -> y.length() - x.length()).collect(Collectors.joining(","));

    到此,相信大家對“java怎么使用stream對日期排序”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    马公市| 郧西县| 台南县| 蓬莱市| 新巴尔虎左旗| 长子县| 印江| 陆丰市| 温州市| 太保市| 金乡县| 广水市| 泽普县| 五河县| 宽甸| 高平市| 兴山县| 黔西县| 霸州市| 新余市| 海丰县| 那坡县| 白玉县| 苍梧县| 惠东县| 公安县| 齐齐哈尔市| 东台市| 闻喜县| 东乡族自治县| 海盐县| 海林市| 乌鲁木齐市| 安龙县| 海丰县| 松江区| 皋兰县| 绵阳市| 嘉荫县| 陆川县| 顺义区|