简单的例子
从一串字符串中,取出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的新成员,允许以声明性方式处理数据集合,即从支持数据处理操作的源生成的元素序列。
- 数据处理操作:类似于数据库的操作,以及函数式编程语言中的常用操作,如filter、 map、 reduce、 find、 match、 sort等。(见例子的list转stream)
- 源:提供数据的源,如集合、数组或输入/输出资源。 需要注意的是从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致。(见例子的list)
- 元素序列:流提供了一个接口,可以访问特定元素类型的一组有序值
流和集合
数据和计算
集合讲的是数据,流讲的是计算。
- 集合是数据结构,所以它的主要目的是以特定的时间/空间复杂度存储和访问元素(如ArrayList 与 LinkedList)。
- 流的目的在于表达计算,比如filter、 sorted和map。
外部迭代和内部迭代
集合是外部迭代,流是内部迭代。
- 外部迭代:使用Collection接口需要用户去做迭代(比如用for-each)
- 内部迭代:Streams库使用内部迭代——它把迭代做了,还把得到的流值存在了某个地方,只要给出一个函数说要干什么就可以了
流操作
流操作包括中间操作和终端操作。
- 中间操作:中间操作会返回另一个流。需要注意的是,这边并不会计算,只是把流串起来。(见例子的stream的创建)
- 终端操作:会从流的流水线生成结果。其结果是任何不是流的值,比如List、 Integer,甚至void。(见例子的输出)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。