JDK1.8新特性
Stream流
-
操作的是集合或者数组(容器中的元素)。
-
它的出现为了我们更方便的对集合的元素操作。
-
使用步骤
-
获取stream流
- 创建集合,通过集合中的方法获取stream流。
- 创建数组,通过数组来获取流
- 通过Steram流中的静态方法of()获取.
-
中间环节操作
-
不会对原有集合改变,会得到新的流。
-
对集合操作的方法
- 过滤方法:Filter(),
- 去掉重复:distinck()方法。此类需要重写hashcode()和equals()方法.
- 截取部分元素:Limit()
- 跳过几个元素:Skip()
- 提取集合中的元素,应用到一个方法上:
- map(Function f)接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。【也就给定一个逻辑,每个元素应用这个逻辑,最后形成新的流存放这些元素】。
- flatMap(Function f)接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
- mapToDouble(ToDoubleFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 DoubleStream。
- mapToInt(ToIntFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 IntStream。
- mapToLong(ToLongFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 LongStream。
- 排序:
- sorted()产生一个新流,其中按自然顺序排序 元素实现Compareble接口
- sorted(Comparator comp)产生一个新流,其中按比较器顺序排序 传入一个比较器
-
注意: 终止操作不执行,中间环节就不会执行。体现的就是延迟加载的思想。
-
-
终止操作
-
概念:就是将中间操作过程的流,进行终极操作,例如遍历,查找等等
-
查找与匹配:
- allMatch(Predicate p)检查是否匹配所有元素 比如判断 所有员工的年龄都是17岁 如果有一个不是,就返回false
- anyMatch(Predicate p)检查是否至少匹配一个元素 比如判断是否有姓王的员工,如果至少有一个就返回true
- noneMatch(Predicate p)检查是否没有匹配所有元素 employee.getSalary() < 3000; 每个员工的工资如果都高于3000就返回true 如果有一个低于3000 就返回false
- findFirst()返回第一个元素 比如获取工资最高的人 或者 获取工资最高的值是
- findAny()返回当前流中的任意元素 比如随便获取一个姓王的员工
- count()返回流中元素总数
- max(Comparator c)返回流中最大值 比如:获取最大年龄值
- min(Comparator c)返回流中最小值 比如:获取最小年龄的值
- forEach(Consumer c)内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代。相反,Stream API 使用内部迭代——它帮你把迭代做了)
-
规约:
- reduce(T iden, BinaryOperator b) 参1 是起始值, 参2 二元运算,可以将流中元素累计结合起来,得到一个值。返回 T 。 比如: 求集合中元素的累加总和
- reduce(BinaryOperator b) 这个方法没有起始值 可以将流中元素累计结合起来,得到一个值。返回 Optional , 比如你可以算所有员工工资的总和
-
收集:
-
collect(Collector c)将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法
-
Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到 List、Set、Map)。
- List toList()把流中元素收集到List 比如把所有员工的名字通过map()方法提取出来之后,在放到List集合中去
例子:List emps= list.stream().map(提取名字).collect(Collectors.toList()); - Set toSet()把流中元素收集到Set 比如把所有员工的名字通过map()方法提取出来之后,在放到Set集合中去
例子:Set emps= list.stream().collect(Collectors.toSet()); - Collection toCollection()把流中元素收集到创建的集合 比如把所有员工的名字通过map()方法提取出来之后,在放到自己指定的集合中去
例子:Collectionemps=list.stream().map(提取名字).collect(Collectors.toCollection(ArrayList::new)); - Long counting()计算流中元素的个数
例子:long count = list.stream().collect(Collectors.counting()); - Integer summingInt()对流中元素的整数属性求和
例子:inttotal=list.stream().collect(Collectors.summingInt(Employee::getSalary)); - Double averagingInt()计算流中元素Integer属性的平均值
例子:doubleavg=list.stream().collect(Collectors.averagingInt(Employee::getSalary)); - String joining() 连接流中每个字符串 比如把所有人的名字提取出来,在通过"-“横杠拼接起来
例子:String str= list.stream().map(Employee::getName).collect(Collectors.joining(”-")); - Optional maxBy() 根据比较器选择最大值 比如求最大工资
例子:Optionalmax= list.stream().collect(Collectors.maxBy(comparingInt(Employee::getSalary))); - Optional minBy() 根据比较器选择最小值 比如求最小工资
例子:Optional min = list.stream().collect(Collectors.minBy(comparingInt(Employee::getSalary))); - 归约产生的类型 reducing() 从一个作为累加器的初始值开始,利用BinaryOperator与流中元素逐个结合,从而归约成单个值
例子:inttotal=list.stream().collect(Collectors.reducing(0, Employee::getSalar, Integer::sum)); - 转换函数返回的类型 collectingAndThen() 包裹另一个收集器,对其结果转换函数
例子:inthow= list.stream().collect(Collectors.collectingAndThen(Collectors.toList(), List::size)); - Map<K, List> groupingBy() 根据某属性值对流分组,属性为K,结果为V 比如按照 状态分组
例子:Map<Emp.Status, List> map= list.stream().collect(Collectors.groupingBy(Employee::getStatus)); - Map<Boolean, List> partitioningBy() 根据true或false进行分区 比如 工资大于等于6000的一个区,小于6000的一个区
例子:Map<Boolean,List>vd= list.stream().collect(Collectors.partitioningBy(Employee::getSalary));
- List toList()把流中元素收集到List 比如把所有员工的名字通过map()方法提取出来之后,在放到List集合中去
-
-
-
-
并行流与串行流
并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
Java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作。
Stream API 可以声明性地通过 parallel() 与sequential() 在并行流与顺序流之间进行切换。
代码
package StreamAPI;
/*Author:LH
CreatTime:2020.06.25.9:23*/
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;
//给定一个数字列表,如何返回一个由每个数的平方构成的列表呢?,给定【1,2,3,4,5】, 应该返回【1,4,9,16,25】。
public class Test {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream(