Stream
无状态:指元素的处理不受之前元素的影响;
有状态:指该操作只有拿到所有元素之后才能继续下去。
非短路操作:指必须处理所有元素才能得到最终结果;
短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果。
中间操作有状态
distinct
去重 distinct
List<Integer> list = Arrays.asList(1, 2,3, 4, 5, 6, 7, 8, 9,1,1,1,9,9,9);
list.stream().distinct().forEach(System.out::print);//123456789
skip
跳过
List<Integer> list = Arrays.asList(1, 2,3, 4, 5, 6, 7, 8, 9);
list.stream().skip(3).forEach(System.out::print);//456789,跳过前三个
limit
List<Integer> list = Arrays.asList(1, 2,3, 4, 5, 6, 7, 8, 9);
list.stream().limit(5).forEach(System.out::print);//12345, 截取前5个
sorted
能够以自然序或着 用Comparator 接口定义的排序规则 来排序一个流。Comparator 能用用lambada表达式来初始化, 我们还能够逆序一个已经排序的流。
接下来我们将会使用java 8 的流式sorted排序 List 、Map 、 Set
1、sorted() 默认使用自然序排序, 其中的元素必须实现Comparable 接口
2、sorted(Comparator comparator) :我们可以使用lambada 来创建一个Comparator 实例。可以按照升序或着降序来排序元素。
下面代码以自然序排序一个list
list.stream().sorted()
自然序逆序元素,使用Comparator 提供的reverseOrder() 方法
list.stream().sorted(Comparator.reverseOrder())
使用Comparator 来排序一个list,其中放对象的属性,元素逆序
list.stream().sorted(Comparator.comparing(Student::getAge).reversed())
//因为返回的都是stream,所以还需要将它们根据传入的数据类型进行collec进行转换。
Comparator接口======》java.util包下的
方法compare(Object a,Object b); 使用Comparator排序
@Data
@NoArgsConstructor
@ToString
public class Person {
private String name;
private Integer age;
}
****************
package com.it.test;
import java.util.ArrayList;
import java.util.List;
import com.it.pojo.Person;
import java.util.Comparator;
import java.util.stream.Collectors;
public class StreamTest {
public static void main(String[] args) {
Person person1 = new Person();
person1.setAge(21);
person1.setName("21");
Person person2 = new Person();
person2.setAge(19);
person2.setName("19");
Person person3 = new Person();
person3.setAge(19);
person3.setName("20");
Person person4 = new Person();
person4.setAge(20);
person4.setName("20");
Person person5 = new Person();
person5.setAge(19);
person5.setName("18");
List<Person> people = new ArrayList<>();
people.add(person1);
people.add(person2);
people.add(person3);
people.add(person4);
people.add(person5);
List<Person> collect1 = people.stream().sorted((Comparator.comparing(Person::getAge))).collect(Collectors.toList());//只根据年龄排序,升序
System.out.println(collect2);
List<Person> collect2 = people.stream().sorted((Comparator.comparing(Person::getAge)).reversed()).collect(Collectors.toList());//只根据年龄排序,降序
System.out.println(collect2);
List<Person> collect3 = people.stream().sorted((Comparator.comparing(Person::getAge)).thenComparing(Comparator.comparing(Person::getName))).collect(Collectors.toList());//先根据年龄进行排序,遇见相同的,然后根据姓名进行排序,都升序
System.out.println(collect3);
List<Person> collect4 = people.stream().sorted((Comparator.comparing(Person::getAge)).thenComparing(Comparator.comparing(Person::getName)).reversed()).collect(Collectors.toList());/先根据年龄进行排序,遇见相同的,然后根据姓名进行排序,降序【都降序】
System.out.println(collect4);
List<Person> collect5 = people.stream().sorted(Comparator.comparing(Person::getAge).reversed().thenComparing(Comparator.comparing(Person::getName)).reversed()).collect(Collectors.toList());//年龄升序,姓名降序
System.out.println(collect5);
List<Person> collect6 = people.stream().sorted(Comparator.comparing(Person::getAge).reversed().thenComparing(Comparator.comparing(Person::getName))).collect(Collectors.toList());//根据年龄降序,姓名升序
System.out.println(collect6);
}
}
结果
只根据年龄进行排序的,默认是升序
[外链图片转存中…(img-uKEmdv5y-1630250447691)]
根据年龄降序
先根据年龄,后根据姓名排序的,默认都是升序
[外链图片转存中…(img-RyYWVt5D-1630250447693)]
根据年龄和性别,先根据年龄,年龄相同根据性别,只在最后一个comparing上写reversed,两个排序都是降序【根据年龄降序,姓名降序】
[外链图片转存中…(img-12kjUlGR-1630250447694)]
根据年龄升序,年龄相同,根据姓名降序
[外链图片转存中…(img-1q5G32mh-1630250447696)]
排序
List<Integer> list2 = Arrays.asList(1, 4,3, 2, 5, 7, 6, 8, 9);
list2.stream().sorted().collect(Collectors.toList()).forEach(System.out::print);//正序
list2.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()).forEach(System.out::print);//倒序
寄语: