1

简单的例子

从一串字符串中,取出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。(见例子的输出)

大军
847 声望183 粉丝

学而不思则罔,思而不学则殆