Java Stream sorted() 有/无 Comparator示例

后端 潘老师 6个月前 (10-29) 135 ℃ (0) 扫码查看

自 Java 8 以来,sorted() 方法已成为 Stream API 的一部分,用于对流中的元素进行排序。默认情况下,元素按自然顺序排序,但我们可以使用 Comparator 来应用自定义顺序。

// 快速指引
//默认排序
List sortedList = unsortedList.stream().sorted().toList();

//自定义排序
Comparator comparator = ...;
List sortedList = unsortedList.stream().sorted(comparator).toList();

1. Stream sort() 是重载方法

Stream 接口提供了两个用于对元素进行排序的方法:

  • sorted() – 提供默认排序
  • sorted(Comparator) – 根据提供的比较器进行排序。

1.1Stream sorted()

Stream<T> sorted()
  • sorted() 是一种有状态的中间操作,返回一个新的 Stream。
  • 它返回由该流的元素组成的流,按自然顺序排序。
  • 如果该流的元素不可比较,则在执行终端操作时可能会抛出 java.lang.ClassCastException。
  • 对于有序流,排序是稳定的。
  • 对于无序流,不保证稳定性。

1.2. Stream sorted(comparator)

Stream<T> sorted(Comparator<? super T> comparator)
  • 这是一个有状态的中间操作,返回一个新的流。
  • 它返回由该流的元素组成的流,根据提供的 Comparator 进行排序。
  • 对于有序流,排序是稳定的。
  • 对于无序流,不保证稳定性。

2. Stream sorted() 示例

2.1按自然顺序对流元素进行排序

在给定的 Java 示例中,我们按自然顺序对整数列表进行排序,并将其打印到标准输出中。

List<Integer> list = Arrays.asList(2, 4, 1, 3, 7, 5, 9, 6, 8);

List<Integer> sortedList = list.stream()
      .sorted()
      .collect(Collectors.toList());

System.out.println(sortedList); //[1, 2, 3, 4, 5, 6, 7, 8, 9]

2.2. 以相反的顺序对流元素进行排序

在给定的 Java 示例中,我们使用 Comparator.reverseOrder() 以相反的顺序对整数流进行排序,并将其打印到标准输出中。

List<Integer> list = Arrays.asList(2, 4, 1, 3, 7, 5, 9, 6, 8);

List<Integer> sortedList = list.stream()
        .sorted(Comparator.reverseOrder())
        .collect(Collectors.toList());

System.out.println(sortedList); //[9, 8, 7, 6, 5, 4, 3, 2, 1]

2.3. 使用 Comparator 在自定义顺序中对流元素进行排序

在给定的 Java 示例中,我们使用自定义 Comparator 对整数流进行排序并将其打印到标准输出中。

List<Integer> list = Arrays.asList(2, 4, 1, 3, 7, 5, 9, 6, 8);
Comparator<Integer> reverseComparator = new Comparator<Integer>() {
  @Override
  public int compare(Integer i1, Integer i2) {
    return i2.compareTo(i1);
  }
};
List<Integer> sortedList = list.stream()
      .sorted(reverseComparator)
      .collect(Collectors.toList());
System.out.println(sortedList); //[9, 8, 7, 6, 5, 4, 3, 2, 1]

2.4. 使用 Lambda 表达式进行 Stream 排序

使用 lambda 表达式来指定比较逻辑,Java 示例以相反的顺序对整数流进行排序。
我们正在使用内联 lambda 表达式重写先前的比较器逻辑。

List<Integer> list = Arrays.asList(2, 4, 1, 3, 7, 5, 9, 6, 8);
List<Integer> sortedList = list.stream()
      .sorted( (i1, i2) -> i2.compareTo(i1) )
      .collect(Collectors.toList());
System.out.println(sortedList); //[9, 8, 7, 6, 5, 4, 3, 2, 1]

3. 结论

在本 Java 8 Stream 教程中,我们学习了使用 sorted() 方法对流元素进行排序的基础知识。我们学习了按默认升序排序以及使用 Comparator 进行自定义排序。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10479.html
喜欢 (1)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】