Stream sorted()
概述:Java8的Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合或数组进行链状流式的操作。可以更方便的让我们对集合或数组操作。
当我们在操作流的时候,时常需要进行排序操作,这个时候就不得不用的Stream sorted()
示例:
创建实体类:
import lombok.Data;
@Data
public class Person {
private String name;
private Integer age;
private String email;
public Person(String name, Integer age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
数据模拟:
public static List<Person> getPerson(){
ArrayList<Person> personList = new ArrayList<>();
Person person = new Person("张三",16,"zhangsan@gmail.com");
Person person1 = new Person("李四",18,"lisi@gmail.com");
Person person2 = new Person("王五",14,"wangwu@gmail.com");
Person person3 = new Person("赵六",25,"zhaoliu@gmail.com");
personList.add(person);
personList.add(person1);
personList.add(person2);
personList.add(person3);
return personList;
}
需求1:将集合中的数据按照年龄进行升序排序
实现1:
public static void main(String[] args) {
List<Person> person = getPerson();
person.stream()
.sorted(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
})
.forEach(System.out::println);
}
结果如图:
可以看出,这里是在Stream.sorted() 里面创建了匿名内部类重写方法定义了排序规则,当然这里这可以使用lambda表达式,看起来更加优雅
实现1的lambda表达式
public static void main(String[] args) {
List<Person> person = getPerson();
person.stream()
.sorted((o1, o2) -> o1.getAge() - o2.getAge())
.forEach(System.out::println);
}
需求2: 将集合中的数据按照年龄进行升序排序
实现2:
public static void main(String[] args) {
List<Person> person = getPerson();
person.stream()
.sorted((o1, o2) -> o2.getAge() - o1.getAge())
.forEach(System.out::println);
}
结果如图:
可以看到,只需要将排序规则进行修改一下可以实现需求了,可以看到这样已经很优雅的完成了排序。但是,接下来还有比它更优雅的实现方式
实现3:
//实现需求1
public static void main(String[] args) {
List<Person> person = getPerson();
person.stream()
.sorted(Comparator.comparing(Person::getAge))
.forEach(System.out::println);
}
结果如图
实现4:
public static void main(String[] args) {
List<Person> person = getPerson();
person.stream()
.sorted(Comparator.comparing(Person::getAge).reversed())
.forEach(System.out::println);
}
结果如图
在Stream sorted() 中使用方法引用指定按照实体类的某个属性进行排序,默认的排序规则是升序,如果需要降序,调用 reversed() 进行反转即可实现降序需求!
优雅的实现排序需求,就是这么的简单!!!