最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java之使用stream對(duì)日期排序方式

 更新時(shí)間:2023年04月25日 10:10:43   作者:五月天的尾巴  
這篇文章主要介紹了java之使用stream對(duì)日期排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java使用stream對(duì)日期排序

主要講解Stream對(duì)日期字段進(jìn)行排序時(shí)的寫(xiě)法,以及當(dāng)日期字段為null時(shí)的排序策略?;蛘邔?duì)多個(gè)屬性進(jìn)行排序時(shí)的案例

Stream對(duì)對(duì)象中的某個(gè)日期屬性進(jìn)行排序

Student對(duì)象

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());

注意:當(dāng)birthday日期屬性為空時(shí),再使用Comparator.comparing排序會(huì)報(bào)空指針異常,此時(shí)需要指定策略,即當(dāng)日期為空時(shí)排在最前面或排在最后面。

對(duì)日期屬性進(jìn)行排序,并指定日期為空時(shí)的策略

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);

執(zhí)行結(jié)果:

[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():為空時(shí)排在最前面

此方法返回比較器,其是空型比較,并認(rèn)為空值小于非空。null首先通過(guò)以下邏輯進(jìn)行操作:

  • 1.null元素被認(rèn)為小于non-null(即值是null的小于非空的)。
  • 2.當(dāng)兩個(gè)元素都為空時(shí),則認(rèn)為它們相等。
  • 3.當(dāng)兩個(gè)元素都不為空時(shí),指定的Comparator確定順序。
  • 4.如果指定的比較器為null,則返回的比較器將所有非null元素視為相等。
  • 5.如果指定的比較器可序列化,則返回的比較器可序列化。

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

方法返回比較器,其是空型比較,并認(rèn)為比非空更大空值。null首先通過(guò)以下邏輯進(jìn)行操作:

  • 1.null元素被認(rèn)為大于非null。
  • 2.當(dāng)兩個(gè)元素都為空時(shí),則認(rèn)為它們相等。
  • 3.當(dāng)兩個(gè)元素都不為空時(shí),指定的Comparator確定順序。
  • 4.如果指定的比較器為null,則返回的比較器將所有非null元素視為相等。
  • 5.如果指定的比較器可序列化,則返回的比較器可序列化。

Comparator.naturalOrder 和 Comparator.reverseOrder

很多時(shí)候我們會(huì)面臨這樣的場(chǎng)景,那就是排序邏輯不變,一會(huì)兒根據(jù)升序排序,一會(huì)根據(jù)降序排序,這個(gè)時(shí)候如果我們的Comparable 中的排序邏輯可以滿足上面的排序,就是排序類型(升序還是降序)是不滿足的,這個(gè)時(shí)候我們就可以配合Comparator,來(lái)改變?cè)瓉?lái)默認(rèn)的排序類型(其實(shí)就是升序)

nullsFirst與naturalOrder的結(jié)合使用

如下示例:當(dāng)字段為空時(shí)排在最前面,剩下的升序排列

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()))
  • 空值放最后,剩下的倒敘排序

對(duì)象中的多個(gè)屬性進(jìn)行排序

先根據(jù)生日排序,再根據(jù)年齡排序

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);

字符串日期排序

寫(xiě)法一

//DateUtil.convertStringToDate為自封裝的一個(gè)String轉(zhuǎn)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());

寫(xiě)法二:

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());

對(duì)字段進(jìn)行排序,考慮空值的其他寫(xiě)法

/* 請(qǐng)注意,根據(jù)單屬性name進(jìn)行排序,若需要將name為null的對(duì)象也參與排序,則需要:
* .sorted(Comparator.comparing(User::getName, Comparator.nullsLast((o1,o2)->o1.compareTo(o2))))
* 使用方法引用優(yōu)化(注意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(","));

根據(jù)排序結(jié)果來(lái)看,不只是順序沒(méi)有按照傳入的lambda表達(dá)式來(lái)排序,甚至每次排序結(jié)果都是不同的,后發(fā)現(xiàn)這里使用排序的話,就不可以使用并行流來(lái)進(jìn)行操作,應(yīng)當(dāng)使用串行流。

如下:

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springmvc返回html頁(yè)面問(wèn)題如何解決

    Springmvc返回html頁(yè)面問(wèn)題如何解決

    這篇文章主要介紹了Springmvc返回html頁(yè)面問(wèn)題如何解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 如何使用Spring MVC的消息轉(zhuǎn)換器設(shè)置日期格式

    如何使用Spring MVC的消息轉(zhuǎn)換器設(shè)置日期格式

    這篇文章主要介紹了如何使用Spring MVC的消息轉(zhuǎn)換器設(shè)置日期格式,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • spring框架集成flyway項(xiàng)目的詳細(xì)過(guò)程

    spring框架集成flyway項(xiàng)目的詳細(xì)過(guò)程

    今天通過(guò)本文給大家分享spring框架集成flyway項(xiàng)目的詳細(xì)過(guò)程,由于大多數(shù)都是springboot集成flyway,很少見(jiàn)到spring框架的項(xiàng)目,今天就抽空給大家介紹下spring框架集成flyway項(xiàng)目的方法,一起看看吧
    2021-07-07
  • SSM框架下實(shí)現(xiàn)登錄注冊(cè)的示例代碼

    SSM框架下實(shí)現(xiàn)登錄注冊(cè)的示例代碼

    這篇文章主要介紹了SSM框架下實(shí)現(xiàn)登錄注冊(cè)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 前端與RabbitMQ實(shí)時(shí)消息推送未讀消息小紅點(diǎn)實(shí)現(xiàn)示例

    前端與RabbitMQ實(shí)時(shí)消息推送未讀消息小紅點(diǎn)實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了前端與RabbitMQ實(shí)時(shí)消息推送未讀消息小紅點(diǎn)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • JetBrains IntelliJ IDEA 配置優(yōu)化技巧

    JetBrains IntelliJ IDEA 配置優(yōu)化技巧

    這篇文章主要介紹了JetBrains IntelliJ IDEA 配置優(yōu)化技巧,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • SpringCloud Eureka Provider及Consumer的實(shí)現(xiàn)

    SpringCloud Eureka Provider及Consumer的實(shí)現(xiàn)

    這篇文章主要介紹了SpringCloud Eureka 提供者及調(diào)用者的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • java查找無(wú)向連通圖中兩點(diǎn)間所有路徑的算法

    java查找無(wú)向連通圖中兩點(diǎn)間所有路徑的算法

    這篇文章主要介紹了java查找無(wú)向連通圖中兩點(diǎn)間所有路徑的算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet詳解

    Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet詳解

    HashMap和HashSet都是存儲(chǔ)在哈希桶之中,通過(guò)本文我們可以先了解一些哈希桶是什么,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • 基于mybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)

    基于mybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇基于mybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10

最新評(píng)論

宜兰县| 禹城市| 海城市| 德兴市| 无为县| 永仁县| 四子王旗| 亚东县| 富阳市| 沙洋县| 石阡县| 玛多县| 徐闻县| 壤塘县| 宁陕县| 顺平县| 东乡| 竹溪县| 拉孜县| 文化| 玉树县| 太白县| 普安县| 县级市| 汉川市| 南平市| 遂川县| 石台县| 饶河县| 安顺市| 蚌埠市| 施甸县| 石景山区| 邻水| 庆安县| 伊宁县| 建阳市| 陆河县| 桃江县| 石河子市| 东至县|