流—Stream

(一)创建Stream

方式一:通过集合

List<Employee> employees = EmployeeData.getEmployees();

//default Stream<E> stream() 返回一个顺序流
Stream<Employee> stream = employees.stream();
//default Stream<E> parallelStream() 返回一个并行流
Stream<Employee> parallelStream = employees.parallelStream();

方式二:通过数组

 int[] arr = {1, 2, 3, 4, 5};
        //调用Arrays类的static<T> Stream<T> stream(T[] array) 返回一个流
        IntStream stream = Arrays.stream(arr);
        Employee e1 = new Employee(1001, "Tom");
        Employee e2 = new Employee(1002, "Anna");
        Employee[] arr1 = {e1, e2};
        Stream<Employee> stream1 = Arrays.stream(arr1);

方式三:通过Stream的of()

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);

方式四:创建无限流

//迭代  public static<T> Stream<T> iterate(final T seed,final UnaryOperator<T> f)

//遍历前10个偶数
Stream.iterate(0,t -> t + 2).limit(10).forEach(System.out::println);

(二)Stream的中间操作

一、筛选与切片

filter(Predicate p)		//接收Lambda,从流中排除某些元素
distinct()			//筛选,通过流所生成元素的hashCode()和equals()去除重复元素
limit(long maxSize)		//截断流,使其元素不超过给定数量
skip(long b)			//跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补

二、映射

map(Function f)			//接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
flatMap(Function f)		//接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流

三、排序

sorted()		//产生一个新流,其中按自然顺序排序(自然排序)
sorted(Comparator com)	//产生一个新流,其中按比较器顺序排序(定制排序)

(三)Stream的终止操作

一、匹配与查找

allMath(Predicate p)	//检查是否匹配所有元素
anyMath(Predicate p)	//检查是否至少匹配一个元素
noneMath(Predicate p)	//检查是否没有匹配所有元素
findFirst()		//返回第一个元素
findAny()		//返回当前流中的任意元素
count			//返回流中元素的总个数
max(Comparator c)	//返回流中最小值
min(Comparator c)	//返回流中最大值
forEach(Consumer c)	//内部迭代

二、归约

reduce(T identity, BinaryOperator b)	//可以将流中元素反复结合起来,得到一个值。返回T
reduce(BinaryOperator b)		//可以将流中元素反复结合起来,得到一个值。返回Optional<T>

例题1:计算1-10的自然数的和

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7,8,9,10);
Integer sum = list.stream().reduce(0, Integer::sum);
System.out.println(sum);

例题2:计算公司所有员工的工资总和

 List<Employee> employees = EmployeeData.getEmployees();
 Stream<Double> stream = employees.stream().map(Employee::getSalary);
 Optional<Double> reduce = stream.reduce(Double::sum);
//或者可以这样写:Optional<Double> reduce = stream.reduce((d1,d2) -> d1 + d2);
 System.out.println(reduce);

三、收集

collect(Collector c)	//将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法

Stream API:Collectors

方法 返回类型 作用
toList List 把流中元素收集到List(有序)
toSet Set 把流中元素收集到Set(无序)
toCollection Collection 把流中元素收集到创建的集合

例子:查询id大于1001的员工

List<Employee> employees = EmployeeData.getEmployees();
List<Employee> collect = employees.stream().filter(e -> e.getId() > 1001).collect(Collectors.toList());
collect.forEach(System.out::println);

猜你喜欢

转载自www.cnblogs.com/hellowen/p/12804445.html