在这个快速教程中,我们将学习如何在 Java 8 中对 Set
进行排序。 stream.sorted()
是 Stream
接口的预定义方法,用于对 Set
或任何 Collection
实现的类。
对 Set
的元素进行排序类似于列表的排序。
在这里,我们有一个 Set
的员工,并且集合的类型是 String。
package org.websparrow.sorting;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
public class SetSorting {
public static void main(String[] args) {
Set<String> employees = new HashSet<>();
employees.add("Sunny Tiwari");
employees.add("Ashutosh Pandey");
employees.add("Vipin Singh");
employees.add("Mintoo Prasad");
System.out.println("--- Set before sorted ---");
employees.forEach(System.out::println);
System.out.println("--- Set after sorted ---");
employees.stream().sorted().forEach(System.out::println);
}
}
输出
--- Set before sorted ---
Vipin Singh
Ashutosh Pandey
Mintoo Prasad
Sunny Tiwari
--- Set after sorted ---
Ashutosh Pandey
Mintoo Prasad
Sunny Tiwari
Vipin Singh
或者,我们也可以在重载的 sorted()
方法中将 Comparator.naturalOrder()
作为参数传递,即 sorted(Comparator.naturalOrder())
给出相同的输出。
employees
.stream()
.sorted(Comparator.naturalOrder())
.forEach(System.out::println);
类似地,我们也可以通过调用 compareTo(String *object*)
方法来一一比较元素,就像我们在旧版本的 Java 中所做的那样。它也产生相同的输出。
employees
.stream()
.sorted((o1, o2) -> o1.compareTo(o2))
.forEach(System.out::println);
Set
元素可以通过传递 Comparator.naturalOrder()
以倒序排序。它返回一个比较器,该比较器强加了自然顺序的相反。
package org.websparrow.sorting;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
public class SetSortingReverseOrder {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Sunny Tiwari");
set.add("Ashutosh Pandey");
set.add("Vipin Singh");
set.add("Mintoo Prasad");
System.out.println("--- Set before sorted ---");
set.forEach(System.out::println);
System.out.println("--- Set after sorted (Reverse order) ---");
set.stream().sorted(Comparator.reverseOrder())
.forEach(System.out::println);
System.out.println("--- Set after sorted (Reverse order) Old days ---");
set.stream().sorted((o1, o2) -> o2.compareTo(o1))
.forEach(System.out::println);
}
}
输出
--- Set before sorted ---
Vipin Singh
Ashutosh Pandey
Mintoo Prasad
Sunny Tiwari
--- Set after sorted (Reverse order) ---
Vipin Singh
Sunny Tiwari
Mintoo Prasad
Ashutosh Pandey
--- Set after sorted (Reverse order) Old days ---
Vipin Singh
Sunny Tiwari
Mintoo Prasad
Ashutosh Pandey
我们还可以使用 stream.sorted()
方法对自定义对象 Set
进行排序。让我们有 Car
类以及它的属性,如 id、品牌名称、型号年份等。
package org.websparrow.sorting;
public class Car {
// Generate Getters and Setters...
private int id;
private String brand;
private int modelYear;
public Car(int id, String brand, int modelYear) {
this.id = id;
this.brand = brand;
this.modelYear = modelYear;
}
@Override
public String toString() {
return "Car [id=" + id + ", brand=" + brand + ", modelYear=" + modelYear
+ "]";
}
}
package org.websparrow.sorting;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
public class SetSortingCustomObject {
public static void main(String[] args) {
Set<Car> set = new HashSet<>();
set.add(new Car(166, "Tata", 1967));
set.add(new Car(112, "Mahindra", 1978));
set.add(new Car(66, "Hindustan Motors", 1950));
set.add(new Car(203, "BMW", 1998));
System.out.println("--- Cars before sorted ---");
set.forEach(System.out::println);
System.out.println("--- Cars after sorted ---");
set.stream().sorted(Comparator.comparingInt(Car::getId))
.forEach(System.out::println);
System.out.println("--- Cars after sorted (Old days) ---");
set.stream().sorted((o1, o2) -> o1.getId() - o2.getId())
.forEach(System.out::println);
}
}
输出
--- Cars before sorted ---
Car [id=166, brand=Tata, modelYear=1967]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=66, brand=Hindustan Motors, modelYear=1950]
Car [id=203, brand=BMW, modelYear=1998]
--- Cars after sorted ---
Car [id=66, brand=Hindustan Motors, modelYear=1950]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=166, brand=Tata, modelYear=1967]
Car [id=203, brand=BMW, modelYear=1998]
--- Cars after sorted (Old days) ---
Car [id=66, brand=Hindustan Motors, modelYear=1950]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=166, brand=Tata, modelYear=1967]
Car [id=203, brand=BMW, modelYear=1998]
Comparator
的 reversed()
方法用于尊重已排序 Set 的元素。
package org.websparrow.sorting;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
public class SetSortingCustomObject {
public static void main(String[] args) {
Set<Car> set = new HashSet<>();
set.add(new Car(166, "Tata", 1967));
set.add(new Car(112, "Mahindra", 1978));
set.add(new Car(66, "Hindustan Motors", 1950));
set.add(new Car(203, "BMW", 1998));
System.out.println("--- Cars before sorted ---");
set.forEach(System.out::println);
System.out.println("--- Cars after sorted (Reverse order)---");
set.stream().sorted(Comparator.comparingInt(Car::getId).reversed())
.forEach(System.out::println);
System.out.println("--- Cars after sorted (Reverse order) Old days ---");
set.stream().sorted((o1, o2) -> o2.getId() - o1.getId())
.forEach(System.out::println);
}
}
输出
--- Cars before sorted ---
Car [id=166, brand=Tata, modelYear=1967]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=66, brand=Hindustan Motors, modelYear=1950]
Car [id=203, brand=BMW, modelYear=1998]
--- Cars after sorted (Reverse order)---
Car [id=203, brand=BMW, modelYear=1998]
Car [id=166, brand=Tata, modelYear=1967]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=66, brand=Hindustan Motors, modelYear=1950]
--- Cars after sorted (Reverse order) Old days ---
Car [id=203, brand=BMW, modelYear=1998]
Car [id=166, brand=Tata, modelYear=1967]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=66, brand=Hindustan Motors, modelYear=1950]
同样,我们也可以按 Car
的 brand 名称对其进行排序。
System.out.println("--- Cars after sorted ---");
set.stream().sorted(Comparator.comparing(Car::getBrand))
.forEach(System.out::println);
System.out.println("--- Cars after sorted Old days ---");
set.stream().sorted((o1, o2) -> o1.getBrand().compareTo(o2.getBrand()))
.forEach(System.out::println);
System.out.println("--- Cars after sorted (Reverse order)---");
set.stream().sorted(Comparator.comparing(Car::getBrand).reversed())
.forEach(System.out::println);
System.out.println("--- Cars after sorted (Reverse order) Old days ---");
set.stream().sorted((o1, o2) -> o2.getBrand().compareTo(o1.getBrand()))
.forEach(System.out::println);
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.websparrow.org/java/java-8-how-to-sort-set-with-stream-sorted
内容来源于网络,如有侵权,请联系作者删除!