Java 8 中的 Streams API 详解

1、Java 8 中的 Streams API 详解

Java 8 中的 Stream 是对集合(Collection)对象功能的加强,它专一于对集合对象进行各类很是便利、高效的聚合操做(aggregate operation),或者大批量数据操做 (bulk data operation)。Stream API 借助于一样新出现的 Lambda 表达式,极大的提升编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操做,并发模式可以充分利用多核处理器的优点,使用 fork/join 并行方式来拆分任务和加速处理过程。一般编写并行代码很难并且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就能够很方便地写出高性能的并发程序。 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操做;高级版本的 Stream,用户只要给出须要对其包含的元素执行什么操做,好比 “过滤掉长度大于 10 的字符串”、“获取每一个字符串的首字母”等,Stream 会隐式地在内部进行遍历,作出相应的数据转换。java

2、流的使用详解

(1) 流的构造和转换

// 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();

3、结束语

Stream 的特性能够概括为:web

  • 不是数据结构算法

  • 它没有内部存储,它只是用操做管道从 source(数据结构、数组、generator function、IO channel)抓取数据。编程

  • 它也毫不修改本身所封装的底层数据结构的数据。例如 Stream 的 filter 操做会产生一个不包含被过滤元素的新 Stream,而不是从 source 删除那些元素。api

  • 全部 Stream 的操做必须以 lambda 表达式为参数数组

  • 不支持索引访问数据结构

  • 你能够请求第一个元素,但没法请求第二个,第三个,或最后一个。不过请参阅下一项。多线程

  • 很容易生成数组或者 List并发

  • 惰性化svg

  • 不少 Stream 操做是向后延迟的,一直到它弄清楚了最后须要多少数据才会开始。

  • Intermediate 操做永远是惰性化的。

  • 并行能力

  • 当一个 Stream 是并行化的,就不须要再写多线程代码,全部对它的操做会自动并行进行的。

  • 能够是无限的

    • 集合有固定大小,Stream 则没必要。limit(n) 和 findFirst() 这类的 short-circuiting 操做能够对无限的 Stream 进行运算并很快完成。