⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/qq_31635851 「猫巳」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

在本页中,我们将提供 java 8 Stream sorted()排序的示例。我们可以按照自然顺序和比较器提供的顺序对流进行排序。

在Java8中,可以使用lambda表达式实例化比较器(Comparator)。

我们还可以颠倒自然顺序和比较器(Comparator)提供的顺序。

自然排序使用Comparable提供的排序,该排序必须由实例为流元素的类实现。

在本页中,我们将使用java 8 Stream sorted()方法对列表List, Map和Set进行排序。

1.使用Stream sorted()完成自然排序、比较器和反向排序

下面是sorted()方法的语法

  • sorted():它使用自然顺序对流中的元素进行排序。元素类必须实现Comparable接口。
  • sorted(Comparator<? super T> comparator):这里我们使用lambda表达式创建一个Comparator实例。我们可以按升序和降序对流元素进行排序。

下面的代码行将按自然顺序对列表进行排序。

list.stream().sorted()

要反转自然顺序,Comparator提供reverseOrder()方法。

list.stream().sorted(Comparator.reverseOrder())

下面的代码行使用Comparator对列表进行排序。

list.stream().sorted(Comparator.comparing(Student::getAge))

为了颠倒顺序,Comparator提供reversed()方法。

list.stream().sorted(Comparator.comparing(Student::getAge).reversed())

2.在List中使用Stream sorted()方法

下面我们对Student列表进行排序操作。首先,我们将按自然顺序排序,然后使用比较器(Comparator)。

下面是颠倒自然排序和比较器提供的排序的例子。

SortList.java

package com.concretepage;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class SortList {
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();
list.add(new Student(1, "Mahesh", 12));
list.add(new Student(2, "Suresh", 15));
list.add(new Student(3, "Nilesh", 10));

System.out.println("---Natural Sorting by Name---");
List<Student> slist = list.stream().sorted().collect(Collectors.toList());
slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));

System.out.println("---Natural Sorting by Name in reverse order---");
slist = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));

System.out.println("---Sorting using Comparator by Age---");
slist = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));

System.out.println("---Sorting using Comparator by Age with reverse order---");
slist = list.stream().sorted(Comparator.comparing(Student::getAge).reversed()).collect(Collectors.toList());
slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));
}
}

Student.java

package com.concretepage;
public class Student implements Comparable<Student> {
private int id;
private String name;
private int age;
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Student ob) {
return name.compareTo(ob.getName());
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
final Student std = (Student) obj;
if (this == std) {
return true;
} else {
return (this.name.equals(std.name) && (this.age == std.age));
}
}
@Override
public int hashCode() {
int hashno = 7;
hashno = 13 * hashno + (name == null ? 0 : name.hashCode());
return hashno;
}
}

输出

---Natural Sorting by Name---
Id:1, Name: Mahesh, Age:12
Id:3, Name: Nilesh, Age:10
Id:2, Name: Suresh, Age:15
---Natural Sorting by Name in reverse order---
Id:2, Name: Suresh, Age:15
Id:3, Name: Nilesh, Age:10
Id:1, Name: Mahesh, Age:12
---Sorting using Comparator by Age---
Id:3, Name: Nilesh, Age:10
Id:1, Name: Mahesh, Age:12
Id:2, Name: Suresh, Age:15
---Sorting using Comparator by Age with reverse order---
Id:2, Name: Suresh, Age:15
Id:1, Name: Mahesh, Age:12
Id:3, Name: Nilesh, Age:10

3.在Set中使用Stream sorted()方法

下面我们对Student类的集合(Set)进行排序操作,此类必须重写equals()hashCode()方法来标识唯一的元素。

对于自然排序,学生类需要实现Comparable接口。

在下面的例子中,我们将使用自然排序和比较器提供的排序对集合进行排序。

SortSet.java

package com.concretepage;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
public class SortSet {
public static void main(String[] args) {
Set<Student> set = new HashSet<Student>();
set.add(new Student(1, "Mahesh", 12));
set.add(new Student(2, "Suresh", 15));
set.add(new Student(3, "Nilesh", 10));

System.out.println("---Natural Sorting by Name---");
set.stream().sorted().forEach(e -> System.out.println("Id:"
+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));

System.out.println("---Natural Sorting by Name in reverse order---");
set.stream().sorted(Comparator.reverseOrder()).forEach(e -> System.out.println("Id:"
+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));

System.out.println("---Sorting using Comparator by Age---");
set.stream().sorted(Comparator.comparing(Student::getAge))
.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));

System.out.println("---Sorting using Comparator by Age in reverse order---");
set.stream().sorted(Comparator.comparing(Student::getAge).reversed())
.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));
}
}

输出

---Natural Sorting by Name---Id:1, Name: Mahesh, Age:12Id:3, Name: Nilesh, Age:10Id:2, Name: Suresh, Age:15---Natural Sorting by Name in reverse order---Id:2, Name: Suresh, Age:15Id:3, Name: Nilesh, Age:10Id:1, Name: Mahesh, Age:12---Sorting using Comparator by Age---Id:3, Name: Nilesh, Age:10Id:1, Name: Mahesh, Age:12Id:2, Name: Suresh, Age:15---Sorting using Comparator by Age in reverse order---Id:2, Name: Suresh, Age:15Id:1, Name: Mahesh, Age:12Id:3, Name: Nilesh, Age:10

4.在Map中使用Stream sorted()方法

这里我们将按键和值对Map进行排序。

SortMap.java

package com.concretepage;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
public class SortMap {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(15, "Mahesh");
map.put(10, "Suresh");
map.put(30, "Nilesh");

System.out.println("---Sort by Map Value---");
map.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue))
.forEach(e -> System.out.println("Key: "+ e.getKey() +", Value: "+ e.getValue()));

System.out.println("---Sort by Map Key---");
map.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey))
.forEach(e -> System.out.println("Key: "+ e.getKey() +", Value: "+ e.getValue()));
}
}

输出

---Sort by Map Value---
Key: 15, Value: Mahesh
Key: 30, Value: Nilesh
Key: 10, Value: Suresh
---Sort by Map Key---
Key: 10, Value: Suresh
Key: 15, Value: Mahesh
Key: 30, Value: Nilesh

下面我们要对值为自定义对象的Map进行排序。

SortMapOfCustomObject.java

package com.concretepage;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
public class SortMapOfCustomObject {
public static void main(String[] args) {
Map<Integer, Student> map = new HashMap<>();
map.put(1, new Student(1, "Mahesh", 12));
map.put(2, new Student(2, "Suresh", 15));
map.put(3, new Student(3, "Nilesh", 10));
//Map Sorting by Value i.e student's natural ordering i.e by name
map.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue))
.forEach(e -> {
Integer key = (Integer)e.getKey();
Student std = (Student)e.getValue();
System.out.println("Key: " + key +", value: ("+ std.getId() +", "+ std.getName()+", "+ std.getAge()+")");
});
}
}

输出

Key: 1, value: (1, Mahesh, 12)
Key: 3, value: (3, Nilesh, 10)
Key: 2, value: (2, Suresh, 15)

文章目录
  1. 1. 1.使用Stream sorted()完成自然排序、比较器和反向排序
  2. 2. 2.在List中使用Stream sorted()方法
  3. 3. 3.在Set中使用Stream sorted()方法
  4. 4. 4.在Map中使用Stream sorted()方法