在 Java 中按多个字段对流进行排序 - 按排序示例分组

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(458)   2023-06-26 07:54:18

学习使用 ComparatorsComparator.thenComparing() 方法按多个字段对对象流进行排序。此方法返回一个带有另一个比较器的lexicographic-order 比较器。它提供与 SQL GROUP BY 子句相同的效果。

1. 为多个字段创建比较器

要对多个字段进行排序,我们必须首先为要对流项目进行排序的每个字段创建简单的比较器。然后,我们以所需的顺序链接这些比较器实例,使 GROUP BY 对完整的排序行为产生影响。

请注意,Comparator 提供了一些其他方法,如果它们符合要求,我们可以使用它们。

  • 然后比较(keyExtractor)
  • thenComparing(比较器)
  • thenComparing(keyExtractor, comparator)
  • thenComparingDouble(keyExtractor)
  • thenComparingInt(keyExtractor)
  • thenComparingLong(keyExtractor)
//first name comparator
Comparator<Employee> compareByFirstName = Comparator.comparing( Employee::getFirstName );
 
//last name comparator
Comparator<Employee> compareByLastName = Comparator.comparing( Employee::getLastName );
 
//Compare by first name and then last name (multiple fields)
Comparator<Employee> compareByFullName = compareByFirstName.thenComparing(compareByLastName);
 
//Using Comparator - pseudo code
list.stream().sorted( comparator ).collect();

2. 复数比较器排序

下面给出的是使用 thenComparing() 创建 Comparator 的示例,它能够按员工的名字姓氏

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
 
public class Main 
{
  public static void main(String[] args) 
  {
    ArrayList<Employee> employees = getUnsortedEmployeeList();
     
    //Compare by first name and then last name
    Comparator<Employee> compareByName = Comparator
                        .comparing(Employee::getFirstName)
                        .thenComparing(Employee::getLastName);
     
    List<Employee> sortedEmployees = employees.stream()
                    .sorted(compareByName)
                    .collect(Collectors.toList());
     
    System.out.println(sortedEmployees);
  }
 
  private static ArrayList<Employee> getUnsortedEmployeeList() 
  {
    ArrayList<Employee> list = new ArrayList<>();
    list.add( new Employee(2l, "Lokesh", "Gupta") );
    list.add( new Employee(1l, "Alex", "Gussin") );
    list.add( new Employee(4l, "Brian", "Sux") );
    list.add( new Employee(5l, "Neon", "Piper") );
    list.add( new Employee(3l, "David", "Beckham") );
    list.add( new Employee(7l, "Alex", "Beckham") );
    list.add( new Employee(6l, "Brian", "Suxena") );
        return list;
  }
}

程序输出。

[E[id=7, firstName=Alex,  lastName=Beckham], 
E [id=1, firstName=Alex,  lastName=Gussin], 
E [id=4, firstName=Brian,   lastName=Sux], 
E [id=6, firstName=Brian,   lastName=Suxena], 
E [id=3, firstName=David,   lastName=Beckham], 
E [id=2, firstName=Lokesh,  lastName=Gupta], 
E [id=5, firstName=Neon,  lastName=Piper]]

3.总结

类似于链式谓词,我们可以组合任意数量的比较器来创建任何复杂的排序逻辑并使用它对Stream 项进行排序。

我们可以使用其他 Comparator 方法以及 官方 Java 文档

快乐学习!!

地址:https://www.cundage.com/article/sort-stream-multiple-fields.html

相关阅读

在 Comparable 和 Comparator 接口、数组.sort() 和 Stream.sorted() API。 我们将学习按自然顺序、逆序和任何其他自定义顺序对数组进行排序。 1. ...
Java Comparator 接口用于对array 或 列表基于自定义排序顺序的对象。通过在对象中实现 Comparator 的 compare() 方法来实现项目的自定义排序。 1. 何时使...
Java Comparable 和 Comparator 教程展示了如何使用 Comparable 和 Comparator 接口比较 Java 中的对象。在进行排序时比较两个对象是必不可少的。...
学习按字段值对对象列表进行排序。请注意,如果您一次有数百万条记录需要排序,那么数据库查询是最好的方法。否则,使用 Comparable 或 Comparator 接口是一种非常方便的方法。 1....
通过一些示例了解如何使用 Collections.sort() 方法对对象列表进行排序。 默认情况下,sort() 方法将给定列表按升序(或自然顺序)排序。我们可以使用 Collections....
使用 Java 8 Stream API 以升序和降序(反向)顺序按值对 Map 进行排序 的简单快速使用示例。 逻辑的中心是方法 Map.Entry.comparingByValue(),它按...
按字母顺序对 String 的字符进行排序 的 Java 示例 – 使用 Stream.sorted() 和 Arrays.sort() 方法。 1) 使用 Stream API 对字符串进行排...
学习使用 Comparators 和 Comparator.thenComparing() 方法按多个字段对对象流进行排序。此方法返回一个带有另一个比较器的lexicographic-order...
在上一篇文章中,我向您展示了如何在 Java 8 中通过键对 Map 进行排序,今天,我将教您使用 Java 如何通过值对 Map 进行排序 8 个特征,例如lambda 表达式、方法引用、流和...
Java 中的流 可以定义为来自源的元素序列。这里的元素源指的是一个Collection或者Array,为Stream提供数据。 Java 流的设计方式使得大多数流操作(称为中间操作)返回一个流...