Java 8 中的 Streams API 详解

Posted 三名狂客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 8 中的 Streams API 详解相关的知识,希望对你有一定的参考价值。

一、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 会隐式地在内部进行遍历,做出相应的数据转换。

二、流的使用详解

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

三、结束语

Stream 的特性可以归纳为:

  • 不是数据结构

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

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

  • 所有 Stream 的操作必须以 lambda 表达式为参数

  • 不支持索引访问

  • 你可以请求第一个元素,但无法请求第二个,第三个,或最后一个。不过请参阅下一项。

  • 很容易生成数组或者 List

  • 惰性化

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

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

  • 并行能力

  • 当一个 Stream 是并行化的,就不需要再写多线程代码,所有对它的操作会自动并行进行的。

  • 可以是无限的

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

以上是关于Java 8 中的 Streams API 详解的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 中的 Streams API 详解

Java 8 中的 Streams API 详解

Java 8 中的 Streams API 详解

Java 8 中的 Streams API 详解

Java 8 中的 Streams API 详解

Java 8 中的 Streams API 详解