stream排序
时间: 2025-05-30 21:05:10 浏览: 10
### 使用 Stream 进行排序
在 Java 中,`Stream` 提供了一种高效的方式来处理集合数据。通过 `sorted()` 方法可以轻松实现对流中的元素进行排序操作。以下是基于引用内容以及专业知识整理的相关说明。
#### 基本语法
`sorted()` 方法支持自然顺序排序或者自定义比较器排序。其基本形式如下:
```java
stream.sorted([Comparator<? super T> comparator])
```
如果没有提供比较器,则默认按照自然顺序进行排序;如果提供了比较器,则会依据该比较器指定的逻辑进行排序[^2]。
#### 自然顺序排序示例
当对象实现了 `Comparable` 接口时,可以直接调用无参版本的 `sorted()` 函数完成升序排列:
```java
List<Integer> numbers = Arrays.asList(5, 3, 8, 1);
List<Integer> sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出: [1, 3, 5, 8]
```
此代码片段展示了如何利用 stream 对整数列表按从小到大顺序排序[^3]。
#### 自定义比较器排序示例
对于更复杂的场景,比如根据某个字段值降序或其他特定条件排序,可以通过传递 Comparator 实现类给 `sorted()` 来达成目标。下面的例子演示了如何根据 map 的键 "monthtime" 转化成数值大小来进行升序排序[^3]:
```java
List<Map<String, Object>> list = new ArrayList<>();
// ...填充list...
List<Map<String, Object>> result = list.stream()
.sorted((map1, map2) -> {
String m1 = (String) map1.get("monthtime");
String m2 = (String) map2.get("monthtime");
return Integer.compare(Integer.parseInt(m1), Integer.parseInt(m2));
})
.collect(Collectors.toList());
```
另外,在引用[4]中提到过一种特殊类型的排序——百分比字符串排序。这里给出相应的解决方案:
```java
class Person{
private double score;
public Person(double s){
this.score=s*0.01;
}
@Override
public String toString(){
DecimalFormat df=new DecimalFormat("#0.0%");
return "{xiao='"+df.format(score)+"'}";
}
}
public static void main(String[] args){
List<Person> persons=Arrays.asList(new Person(98.9),
new Person(97.9),
new Person(99.9),
new Person(99.9));
System.out.print("排序前->"+persons);
Collections.sort(persons,(p1,p2)->Double.compare(p2.score,p1.score));
System.out.print("\n排序后->"+persons);
}
```
以上程序先创建了一个简单的实体类表示个人成绩信息,并重写了它的toString方法以便于打印输出。接着初始化了一些测试数据并展示原始状态下的人员名单。最后应用 collection framework 下的 sort 功能配合 lambda 表达式完成了从高分至低分依次罗列的效果[^4]。
### 注意事项
一旦某条流水线被终端操作(如 count(), anyMatch() 等)消耗完毕之后就不能再次对其进行其他中间操作(像 filter 或者 flatMap),否则将会抛出 IllegalStateException 异常提示 “stream has already been operated upon or closed”。所以在实际编码过程中要格外留意此类情况的发生[^1]。
阅读全文
相关推荐
















