1.stream简介
stream 是一个用来处理集合个数组的api
jdk 8 引入strream的原因:1.去掉for循环,使编程变的更加简单(实际运行效率可能没有for循环高)2.parallel,多核友好,java函数式编程使得编写并行程序如此简单,你需要的仅仅是调用一下parallel()方法
stream的特性: 1.不是数据结构,没有内存存储 2.不支持索引(没有数据,类似于spark中的RDD,只是搭建计算框架,在最后执行时才执行整个流程) 3.延迟计算 4.支持并行 5.很容易生成数组和集合 6.支持过滤查找转化等多种操作
2.Stream运行机制
Stream分为 源source,中间操作,终止操作 流的源可以是一个数组、一个集合、一个生成器方法,一个I/O通 道等等。 一个流可以有零个和或者多个中间操作,每一个中间操作都会返回 一个新的流,供下一个操作使用。一个流只会有一个终止操作 Stream只有遇到终止操作,它的源才开始执行遍历操作
3.Stream的创建
1、通过数组 2、通过集合来 3、通过Stream.generate方法来创建 4、通过Stream.iterate方法来创建 5、其他API创建
创建stream对象,of 方法中,参数为:(T... ..values) 可看做是一个多个同种类型对象组成的集合,forEach()方法,参数为:(Consumer<? super T>action),即一个Consumer接口,泛型为调用Stream中所装载的对象的父类或者自己,比如下面,调用对象为Stream<Student>,泛型为它的父类Teacher
public static void common_fileInputStream() throws IOException { String[] arr = {"a", "b", "c", "d", "e", "f", "g", "h"}; Student stu = new Student("q"); Stream<String>stud=Stream.of(arr); Stream<Student>student=Stream.of(stu,stu,stu,stu);/**1 of : (T... values)*/ Consumer<Teacher> consumer=new Consumer() { @Override public void accept(Object o) { System.out.println("o = " + o); } }; student.forEach(consumer);/**参数:(Consumer<? super T> action)*/ // stud.forEach(consumer); }
4.Stream常用API
中间操作: 过滤 filter 去重 distinct 排序 sorted 截取 limit、skip 转换 map/flatMap 其他 peek
终止操作: 循环 forEach 计算 min、max、count、 average 匹配 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny 汇聚 reduce 收集器 toArray collec
原文:https://www.cnblogs.com/baierhu/p/14619849.html