Stream——集合数据按照某一字段排序

这篇具有很好参考价值的文章主要介绍了Stream——集合数据按照某一字段排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

之前,针对Stream链式编程中的几个方法做了大致的说明。详情可以参考:

JDK 1.8 新特性之Stream 详解个人笔记

但实际业务中,总会存在很多复杂的思维,需要使用到Stream,此时玩的不熟练总感觉无从下手。

今后开始写几种常用的逻辑方式。

假设业务场景

在数据查询出来后,需要针对集合中的数据信息,按照某一字段进行正序倒序排序。

排序前的准备

创建一个数据元类,并填充数据做一个指定对象的数据集合。

class Users{
    private String userName;
    private String password;

    public Users(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    public String getUserName() {
        return userName;
    }

    @Override
    public String toString() {
        return "Users{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

测试数据集合如下:

List<Users> users = Arrays.asList(new Users("xj5", "555")
                , new Users("xj2", "2222")
                , new Users("xj1", "1111")
                , new Users("xj3", "3333"));

正序排序

Stream中的排序,通常会使用到其中的sort()方法,接下来就按步骤进行数据排序操作。

1、数据集合的判空 Optional.isPresent()

从数据库等其他方式获取到的数据,并非就一定存在。虽然在本次定义了测试数据集合,但为了代码逻辑的健壮性,则需要经过如下操作处理。

System.out.println("-----> " + Optional.ofNullable(null).isPresent());
System.out.println("-----> " + Optional.ofNullable(new ArrayList<>()).isPresent());

执行后的结果:

-----> false
-----> true

所以,上面的数据集合可以进行下列操作。

Optional.ofNullable(users).orElse(new ArrayList<Users>())

当然也可以通过Optional.ofNullable(集合别名).isPresent()判断集合是否存在,再通过返回 boolean 判断是否继续向下执行链式编程代码。

2、使用sort排序

使用sort排序时,如果其中是对象,则还需要使用一个Comparator.comparing()的方法转换。

Optional.ofNullable(users)
        .orElse(new ArrayList<Users>())
        .stream()
        .sorted(Comparator.comparing(Users::getUserName))

3、将排序后的数据流转换为list

List<Users> collect = Optional.ofNullable(users)
                .orElse(new ArrayList<Users>())
                .stream()
                .sorted(Comparator.comparing(Users::getUserName))
                .collect(Collectors.toList());

执行后,日志输出如下信息:

[Users{userName='xj1', password='1111'},
 Users{userName='xj2', password='2222'}, 
 Users{userName='xj3', password='3333'}, 
 Users{userName='xj5', password='555'}]

你以为这样就完了?

Optional.ofNullable只是判断传递的参数是否为null,如果传递的参数是对象,则还需要注意对象中的每个属性的数据是否为null。

看一个反例,如果其中某个对象的值是null时,会出现什么样的情况?

package xj.test.streams;

import java.util.*;
import java.util.stream.Collectors;

public class Test6 {
    public static void main(String[] args) {
        List<Users> users = Arrays.asList(new Users("xj5", "555")
                , new Users("xj2", "2222")
                , new Users("xj1", "1111")
                , new Users("xj3", "3333")
                , new Users(null,"null"));

        List<Users> collect = Optional.ofNullable(users)
                .orElse(new ArrayList<Users>())
                .stream()
                .sorted(Comparator.comparing(Users::getUserName))
                .collect(Collectors.toList());
        System.out.println(collect);
    }
}

Stream——集合数据按照某一字段排序
此处出现空指针的问题,在于Comparator.comparing中的数据元,存在空的问题,报错!

解决方式也很简单,将需要排序的字段,在sort操作之前可以进行一次过滤,如下:

public class Test6 {
    public static void main(String[] args) {
        List<Users> users = Arrays.asList(new Users("xj5", "555")
                , new Users("xj2", "2222")
                , new Users("xj1", "1111")
                , new Users("xj3", "3333")
                , new Users(null,"null"));

        List<Users> collect = Optional.ofNullable(users)
                .orElse(new ArrayList<Users>())
                .stream()
                .filter(x->Objects.nonNull(x) && x.getUserName() != null)
                .sorted(Comparator.comparing(Users::getUserName))
                .collect(Collectors.toList());
        System.out.println(collect);
    }
}

成功解决!

倒序排序

倒序排序操作并不是很复杂,只需要在排序的Comparator.comparing(Users::getUserName)后,将结果使用reversed()反转一下就可以实现。如下所示:

public class Test6 {
    public static void main(String[] args) {
        List<Users> users = Arrays.asList(new Users("xj5", "555")
                , new Users("xj2", "2222")
                , new Users("xj1", "1111")
                , new Users("xj3", "3333")
                , new Users(null,"null"));

        List<Users> collect = Optional.ofNullable(users)
                .orElse(new ArrayList<Users>())
                .stream()
                .filter(x->Objects.nonNull(x) && x.getUserName() != null)
                .sorted(Comparator.comparing(Users::getUserName).reversed())
                .collect(Collectors.toList());
        System.out.println(collect);
    }
}

Stream——集合数据按照某一字段排序文章来源地址https://www.toymoban.com/news/detail-444164.html

到了这里,关于Stream——集合数据按照某一字段排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stream流获取集合中一个字段

    例子:         ListRefOrderProductPo refOrderProductPos 我现在有这个集合 我想通过stream流 把这个集合中 每一个对象里面的 skuNo 放到一个新的集合里面            可以使用 map 操作将每个 RefOrderProductPo 对象转换为其 skuNo 属性,并将结果收集到一个新的集合中。示例代码如下

    2024年02月04日
    浏览(37)
  • Java8 Stream流List<JSONObject>通过某一属性进行排序

    List对象 1.首先你需要list.parallelStream().sorted 进行流处理,使用parallelStream可以充分调度多核CPU。 2.使用Comparator.comparing进行排序,reversed()进行倒序排列,thenComparing进行下一个排序。 3.Comparator.comparing()里面的内容,也是就是Object::getter,例如Test::getName 4.最后格式化为需要的格式

    2024年02月12日
    浏览(61)
  • HBase 表如何按照某表字段排序后顺序存储的方法?

    首先需要明白HBase表的排序规则: (1)rowkey排序(字典排序)——升序 (2)Column排序(字典排序)——升序 (3)时间戳排序——降序 rowkey 字典序排序可点击下方链接了解。 [HBase] - 理解 HBase Rowkey 字典排序 https://www.jianshu.com/p/d4609b5bb9f3 如果想按照某列字段来排序,则需要

    2024年02月07日
    浏览(54)
  • Java 字段 Stream 排序

    这篇博客简单记录下 Java 字段 Stream 排序常用方式,欢迎阅读斧正。 用到的类如下: 准备数据: 升序使用 .sorted(Comparator.Comparing(YourClass::Class\\\'s Field) 就行,降序使用 .sorted(Comparator.Comparing(YourClass::Class\\\'s Field, Comparator.reverseOrder()) 。 输出: 利用的是 thenComparing() :升序 thenCom

    2024年02月15日
    浏览(49)
  • stream流的使用-获取list集合中对象的单个字段list集合,进行累加操作

    场景及代码案例源于实际项目 现存一list集合,其中保存了投资人的信息。 Person (name, age, money rateOfReturn) 其中的money表示投资人现有资产,rateOfReturn表示投资年回报率 需求: 1.计算投资人年龄之和; 2.根据现有资产及投资回报率,计算所有投资人一年后的资产总和; 实体

    2023年04月22日
    浏览(63)
  • 使用Stream流对集合排序

    有一些业务需要对集合按照一些规则进行排序,本篇介绍如何用Stream()对集合进行升序或者降序操作。 之前只有接触过使用数据库进行排序,有一些情况需要不同的排序结果,如果进行多次查询会多次操作数据库,所以有些地方使用流对集合操作是更好的选择。 Stream 流 - 调

    2024年02月12日
    浏览(59)
  • 集合list排序,普通排序,stream(单属性、多属性)排序

    1、list基本类型 1.1 Collections.sort排序 1.2 list.sort排序 1.3 list.stream()排序 2、list对象 List类 list = new ArrayList(); 2.1 单属性排序(升序) list.stream().sorted(Comparator.comparing(类::属性一)); 2.2 单属性排序(降序) list.stream().sorted(Comparator.comparing(类::属性一).reversed()); //先以属性一升序,而后

    2024年02月16日
    浏览(44)
  • Java Stream流对多个字段进行排序

    谈起Java 8,不少熟悉它的人,都会知道有一个对我们帮助很大的新特性,没错,就是我们在项目中经常用到的stream,它对我们处理数据的过程中提供了很多的便利,而这边文章主要讲述stream的便利之一:对多个字段进行排序 首先我们在数据库中插入几条样例数据 要求:按照

    2024年02月10日
    浏览(41)
  • 使用Java的stream().sorted方法对集合进行排序

    Java Stream API 提供了丰富的方法来对流中的元素进行处理和操作。其中, sorted() 方法用于对流中的元素进行排序。本文将深入探讨 sorted() 方法的用法、示例代码以及详细解释,以帮助您更好地理解和使用这个方法。 StreamT sorted() : 这个方法用于对流中的元素进行自然排序。要

    2024年02月04日
    浏览(55)
  • JDK8的lambda方式List多字段排序List.stream().sorted()

    JDK8的lambda方式List多字段排序List.stream().sorted() 多字段排序 拼音排序: 引入jar包: 自定义比较器: 结束。

    2024年02月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包