Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果
一、创建流
1、 Collection接口有默认的stream方法,这个也就是大家平时用的list.stream(),只要是这个接口的实现类都可以通过这种方式去创建一个流
Lists.newArrayList().stream();
2、Stream的静态方法
// 1、通过 build 方法创建
Stream.Builder builder = Stream.builder(); builder.accept(1); builder.add(2); Stream build = builder.build();
// 2、通过Stream.of 方法创建
// of有2个重载的方法,一个是接受一个对象,一个是接受可变参数创建流 Stream s1 = Stream.of(1); Stream s2 = Stream.of(1,2,3,4,5);
// 3、通过Stream.generate 静态方法去创建一个流。这个特别需要注意,这个方法是创建无限流,如果不在调用这个函数后调用limit方法去限制流的长度,则会无限创建下去
// 这里传入的行为参数一定是有返回值的,也就是行为的结果是创建了一个对象。
Stream generate = Stream.generate(Math::random).limit(10); Stream g2 = Stream.generate(() -> Math.random()).limit(10);
// 4、通过Stream.iterate 迭代的去创建流,同上也是无限流,不同的地方在于这个函数有2个参数,第一个参数是基值,第二个参数是基于第一个参数的运算函数。如下生成自然数序列
// 这里iterate,会迭代的进行第二个参数的运算,
Stream limit = Stream.iterate(0, n -> n +1).limit(10);
// 5、 Stream.empty()创建一个空的流
// 6、Stream.concat(arg1,arg2) 将2个流合并为一个流