Java 8中 Stream 的 sorted() 可实现按照自然排序,也可使用 Comparator 提供的排序对流进行排序;支持使用 lambda 表达式进行实例化;还可实现反转自然排序。
1、sorted() 使用
按自然升序对集合进行排序,默认是升序排列;使用 Comparator 提供 reverseOrder() 方法实现降序排列。
list.stream().sorted() .stream().sorted();
list.stream().sorted(Comparator.reverseOrder()) .stream().sorted(Comparator.reverseOrder());
2、升序降序实现
import lombok.Data;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class TestStreamSorted {
public static void sorted() {
List<Integer> list = Arrays.asList(5, 4, 3, 2, 7, 1, 6, 0, 9, 8);
List<Integer> newList = list.stream().map(x -> x + 1).collect(Collectors.toList());
List<Integer> ascList = newList.stream().sorted().collect(Collectors.toList());
List<Integer> descList1 = newList.stream().sorted(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
}).collect(Collectors.toList());
List<Integer> descList2 = newList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
System.out.println("原始数组:" + list);
System.out.println("自增一后:" + newList);
System.out.println("升序数组:" + ascList);
System.out.println("降序数组1:" + descList1);
System.out.println("降序数组2:" + descList2);
System.out.println();
List<User> personList = new ArrayList<>();
personList.add(new User("张三", 16, 181));
personList.add(new User("李四", 17, 180));
personList.add(new User("王五", 16, 179));
personList.add(new User("张明", 18, 177));
personList.add(new User("李威", 16, 190));
personList.add(new User("王鹏", 15, 188));
personList.add(new User("王莉", 17, 177));
//年龄升序,相同年龄身高升序
List<User> ascPList = personList.stream()
.sorted(Comparator.comparingInt(User::getAge).thenComparing(User::getHeight))
.collect(Collectors.toList());
//年龄降序,相同年龄身高降序
List<User> descPList = personList.stream()
.sorted(Comparator.comparingInt(User::getAge).reversed().thenComparing(User::getHeight).reversed())
.collect(Collectors.toList());
printStudents(ascPList);
printStudents(descPList);
}
public static void printStudents(List<User> userList) {
System.out.println("【姓名】 【年龄】 【身高】");
System.out.println("-----------------------");
userList.forEach(s -> System.out.println(s.toString()));
System.out.println(" ");
}
public static void main(String[] args) {
sorted();
}
}
@Data
class User {
private String name;
private Integer age;
private Integer height;
public User(String name, Integer age, Integer height) {
this.name = name;
this.age = age;
this.height = height;
}
public String toString() {
String info = String.format("%s %s %s ", this.name, this.age.toString(), this.height.toString());
return info;
}
}
打印输出:
原始数组:[5, 4, 3, 2, 7, 1, 6, 0, 9, 8]
自增一后:[6, 5, 4, 3, 8, 2, 7, 1, 10, 9]
升序数组:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
降序数组1:[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
降序数组2:[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
【姓名】 【年龄】 【身高】
-----------------------
王鹏 15 188
王五 16 179
张三 16 181
李威 16 190
王莉 17 177
李四 17 180
张明 18 177
【姓名】 【年龄】 【身高】
-----------------------
王鹏 15 188
李威 16 190
张三 16 181
王五 16 179
李四 17 180
王莉 17 177
张明 18 177