Java 8 中的 Stream 是对集合(Collection)对象功能的加强,它专一于对集合对象进行各类很是便利、高效的聚合操做(aggregate operation),或者大批量数据操做 (bulk data operation)。Stream API 借助于一样新出现的 Lambda 表达式,极大的提升编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操做,并发模式可以充分利用多核处理器的优点,使用 fork/join 并行方式来拆分任务和加速处理过程。一般编写并行代码很难并且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就能够很方便地写出高性能的并发程序。 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操做;高级版本的 Stream,用户只要给出须要对其包含的元素执行什么操做,好比 “过滤掉长度大于 10 的字符串”、“获取每一个字符串的首字母”等,Stream 会隐式地在内部进行遍历,作出相应的数据转换。java
// 1. Individual values Stream stream = Stream.of("a", "b", "c"); // 2. Arrays String [] strArray = new String[] {"a", "b", "c"}; stream = Stream.of(strArray); stream = Arrays.stream(strArray); // 3. Collections List<String> list = Arrays.asList(strArray); stream = list.stream();
Stream 的特性能够概括为:web
不是数据结构算法
它没有内部存储,它只是用操做管道从 source(数据结构、数组、generator function、IO channel)抓取数据。编程
它也毫不修改本身所封装的底层数据结构的数据。例如 Stream 的 filter 操做会产生一个不包含被过滤元素的新 Stream,而不是从 source 删除那些元素。api
全部 Stream 的操做必须以 lambda 表达式为参数数组
不支持索引访问数据结构
你能够请求第一个元素,但没法请求第二个,第三个,或最后一个。不过请参阅下一项。多线程
很容易生成数组或者 List并发
惰性化svg
不少 Stream 操做是向后延迟的,一直到它弄清楚了最后须要多少数据才会开始。
Intermediate 操做永远是惰性化的。
并行能力
当一个 Stream 是并行化的,就不须要再写多线程代码,全部对它的操做会自动并行进行的。
能够是无限的