文章目录

  • 简介
  • Stream对对象中的某个日期属性进行排序
  • 对日期属性进行排序,并指定日期为空时的策略
  • 排序策略
    • nullsFirst():为空时排在最前面
    • nullsLast():为空时排在最后面
    • Comparator.naturalOrder 和 Comparator.reverseOrder
  • 对对象中的多个属性进行排序
  • 字符串日期排序
  • 对字段进行排序,考虑空值的其他写法

简介

本文主要讲解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>() {@Overridepublic 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对日期排序相关推荐

  1. Java stream().sorted()实现排序(升序、降序、多字段排序)

    1 自然排序 sorted():自然排序,流中元素需实现Comparable接口 package com.entity;import lombok.*;@Data @ToString @AllArgs ...

  2. java日期排序_java实现日期排序问题

    展开全部 java按文件日期排序方法,下面以对62616964757a686964616fe59b9ee7ad9431333337623431C盘Java目录下文件进行按日期排序为例://引用java ...

  3. Java后端如何对日期做储存并可以以日期排序

    Java后端如何对日期做储存并可以以日期排序 需求 案例:对User创建时间排序 做法 具体 用Long储存对象属性,get/set方法 在service中准备存对象时候,创建时间戳对对象属性赋值 U ...

  4. Java 8 Stream:遍历、筛选、指定、排序、统计等

    Java 8 Stream Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种 ...

  5. java多字段排序,java8 stream多字段排序的实现

    很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理 使用java8新特性,下面先来点基础的 List list; 代表某集合 //返回 对象集合以类属性一 ...

  6. 万字详解,JDK1.8新特性的Lambda、Stream和日期的使用详解

    前言 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScr ...

  7. 万字详解,JDK1.8的Lambda、Stream和日期的使用详解

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 本文 ...

  8. 万字详解Lambda、Stream和日期

    作者:虚无境 来源:cnblogs.com/xuwujing/p/10145691.html 前言 本篇主要讲述是Java中JDK1.8的一些语法特性的使用,主要是Lambda.Stream和Loca ...

  9. java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程

    在这篇教程中,将向你展示如何使用Java 8 Stream的Collectors,来对一个List进行分组,计算个数,求和以及排序. 1. Group By, Count and Sort 1.1 对 ...

最新文章

  1. Matlab-bp神经网络
  2. python web server comparison
  3. int.TryParse的使用
  4. C语言模拟实现标准库函数之strcpy()
  5. Ubuntu 16.04通过Snap安装应用程序
  6. 关于服务网关的几个问题
  7. 数学之路(3)-机器学习(3)-机器学习算法-欧氏距离(3)
  8. 点云质量评估_Chamfer Distance--倒角距离
  9. 转载【C++】int转换为string的两种方法(to_string、字符串流)
  10. java uuid to long,生成long类型的UUID
  11. OMNeT 例程 Tictoc15 和 Tictoc16 矢量和标量统计详解
  12. Flutter RSA加密解密
  13. 用GZIPOutputStream流压缩出现H4sIAAAAAAAAAA==
  14. Python初学(2)—— 基本数据类型
  15. 华为鸿蒙ota升级,华为鸿蒙系统官方,华为鸿蒙系统官方升级名单预约 v2.0 - 浏览器家园...
  16. 李大潜:学习数学是战略性投资【导图版】
  17. Cobalt Strike:解密 DNS 流量——第 5 部分
  18. 微信浏览器中打开QQ聊天QQ群
  19. [转载]Markdown文档中常用的一些符号
  20. BLE安全|低功耗蓝牙安全:方法、工具和开源协议栈

热门文章

  1. 详细解说IMU惯性测量单元
  2. Blender及其游戏引擎
  3. List View Android官方API Guides
  4. transformer中pos embedding原理
  5. 2022N1叉车司机考试题模拟考试题库及答案
  6. linux 文件/目录名 颜色
  7. 学iOS开发如何选择iOS培训机构之浅析
  8. 当钢铁侠征服海陆空:荣耀20系列行业寒冬写下让人心潮澎湃的胜利故事
  9. python中1%7是多多少_再传捷报!原子同学优秀学员Python成绩位列全国前1%!
  10. WordPress自媒体主题:Zibll V3.0 bate(免费下载)