简单的例子
从一串字符串中,取出2个长度为1的字符。
public class Test {
public static void main(String[] args) {
List<String> list = Arrays.asList("1", "2", "3", "11", "22", "33");
Stream<String> stream = list.stream()
.filter((str) -> str.length() == 1)
.limit(2);
System.out.println(stream.collect(Collectors.toList()));
}
}
流简介
流是Java8的新成员,容许以声明性方式处理数据集合,即从支持数据处理操做的源生成的元素序列。java
- 数据处理操做:相似于数据库的操做,以及函数式编程语言中的经常使用操做,如filter、 map、 reduce、 find、 match、 sort等。(见例子的list转stream)
- 源:提供数据的源,如集合、数组或输入/输出资源。 须要注意的是从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致。(见例子的list)
- 元素序列:流提供了一个接口,能够访问特定元素类型的一组有序值
流和集合
数据和计算
集合讲的是数据,流讲的是计算。数据库
- 集合是数据结构,因此它的主要目的是以特定的时间/空间复杂度存储和访问元素(如ArrayList 与 LinkedList)。
- 流的目的在于表达计算,好比filter、 sorted和map。
外部迭代和内部迭代
集合是外部迭代,流是内部迭代。编程
- 外部迭代:使用Collection接口须要用户去作迭代(好比用for-each)
- 内部迭代:Streams库使用内部迭代——它把迭代作了,还把获得的流值存在了某个地方,只要给出一个函数说要干什么就能够了
流操做
流操做包括中间操做和终端操做。数组
- 中间操做:中间操做会返回另外一个流。须要注意的是,这边并不会计算,只是把流串起来。(见例子的stream的建立)
- 终端操做:会从流的流水线生成结果。其结果是任何不是流的值,好比List、 Integer,甚至void。(见例子的输出)