Java 8 Stream

Stream学习
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

什么是stream,stream到底是什么?
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
“集合讲的是数据,stream讲的是计算”

注意
①stream自己不会存储元素
②stream不会改变源对象,相反,他们会返回一个持有结果的新stream。
③stream操作时延迟执行的,这意味着他们会等到需要的结果的时候才执行

stream操作的三个步骤
1、创建stream
一个数据源(如:集合、数组),获取一个流
2、中间操作
一个操作链,对数据源的数据进行处理
3、终止操作(中断操作)
一个执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用
在这里插入图片描述
stream的创建方式
方法一:通过集合
default Stream stream():返回一个顺序流
default Stream parallelStream():返回一个并行流 /ˈpærəlel/ n. 平行线;对比

方法二:通过数组
Java 8中的Arrays的静态方法stream()可以获取数组流:
static Stream stream(T[] array):返回一个流

int[] arr = new int[]{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,"Jack");
Employee[] arr1 = new Employee[]{e1,e2};
Stream<Employee> stream1 = Arrays.stream(arr1)

重载形式,能够处理对应基本类型的数组:
public static IntStream stream(int [] array)
public static LongStream stream(long [] array)
public static DoubleStream stream(double [] array)

方法三:通过stream的of()
可以调用Stream类静态方法of(),通过显示值创建一个流。它可以接收任意数量的参数。
public static Stream of(T…values):返回一个流

Stream.of(T...values)

方法四:创建无限流 (了解)
可以是用静态方法Stream.itreate()和Stream.generate()创建无限流

//迭代
public static<T> Stream<T> iterate(final T seed,final UnaryOperator<T> f)
//遍历前十个偶数
Stream.iterate(0,t->t+2).limit(10).foreach(System.out::println);
//生成
public static<T> Stream<T> generate(Supplier<T> s)
//十个随机数
Stream.generate(Math::random).limit(10).foreach(System.out::println);

stream的中间操作
多个中间操作可以连接来形成一个流水线,除非流水线上触发了终止操作,否则中间操作不会执行任何的处理
而在终止操作时一次性全部处理,称为“惰性求值”。
1.筛选与切片
**filter(Predicate p) 😗*接收lambda,从流中排除某些元素
**distinct() 😗*筛选,通过流所生成元素的hashCode()和equals()去除重复元素
**limit(long maxSize) 😗*截断流,使其元素不超过给定数量
**skip(long n) 😗*跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流,与limit互补
**map(Function f) 😗*接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
**mapToDouble(ToDoubleFunction f) 😗*接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的DoubleStream
**mapToInt(ToIntFunction f) 😗*接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的IntStream
**mapToLong(ToLongFunction f) 😗*接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的LongStream
**flatMap(Function f) 😗*接受一个函数作为函数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
**sorted() 😗*产生一个新流,其中按自然顺序排序
**sorted(Comparator com) 😗*产生一个新流,其中按比较器顺序排序

stream的终止操作
中断操作会从流的流水线上生成结果。其结果可以是任何不是流的值,例如:List、Integer甚至是void。流进行了终止操作后,不能再次使用
匹配与查找
allMatch(Predicate p): 检查是否匹配所有元素
anyMatch(Predicate p) :检查是否匹配至少一个元素
noneMatch(Predicate p): 检查是否没有匹配所有元素
findFirst(): 返回第一个元素
findAny() :返回当前流中的任意元素
count(): 返回流元素中的总数
max(Comparator c): 返回流中的最大值
min(Comparator c): 返回流中的最小值
forEach(Comparator c): 内部迭代(使用Collection接口需要用户去做迭代称为外部迭代。相反,Stream API使用内部迭代—它帮你把迭代做了)

//获取工资最高值
list.stream().map(e->e.getSalart).max(Double::compare)

归约
reduce(T iden,BinaryOperator b) :可以将流中元素反复结合起来,得到一个值。返回T
reduce(BinaryOperator b) :可以将流中元素反复结合起来,得到一个值。返回一个Optional
备注:map和reduce的连接通常称为map-reduce模式,因Google用它来进行网络搜索而出名

//计算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);//此处的0为一个初始值

//获取公司员工工资总和
//先获取公司员工信息列表
List<Employee> employees = new ArrayList();
//通过映射获取工资列表
List<Double> salaryStream = employees.stream().map(Employee::getSalary);
Optional<Double> sum = salaryStream.reduce(Double::sum);

收集
collect(Collector t) 将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法
Collector接口中方法的实现决定了如何对流执行收集的操作(如收集到list、set、map)
另外,Collectors实现类提供了很多静态方法,可以方便地创建常见收集器实例,具体方法与实例可以参照另外一位道友的文章 : https://www.cnblogs.com/felordcn/p/collectors.html

此文章为学习过程记录,若有错误或者不足请大佬们不吝赐教!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值