流—Stream
Posted hellowen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流—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);
以上是关于流—Stream的主要内容,如果未能解决你的问题,请参考以下文章