Stream

Posted s-star

tags:

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

(一)简介

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

(二)分类

创建Stream:通过stream()方法,取得集合对象的数据集。
中间操作(Intermediate):通过一系列中间方法,对数据集进行过滤、检索等数据集的再次处理。如,使用filter()方法来对数据集进行过滤。
终止操作(Terminal):通过最终方法完成对数据集中元素的处理。如,使用forEach()完成对过滤后元素的打印。

操作 方法
中间操作 concat()、distinct()、filter()、flatMap()、limit()、map()、peek()、skip()、sorted()、parallel()、sequential()、unordered()
终止操作 allMatch()、anyMatch()、collect()、count()、findAny()、findFirst()、forEach()、forEachOrdered()、max()、min()、noneMatch()、reduce()、toArray()

 

 

 

 

(三)使用

1. 创建Stream

1.1 Stream接口的静态工厂方法

1.1.1 of

生成的Stream是有限长度的,Stream的长度为其内的元素个数。

Stream<Integer> integerStream = Stream.of(1, 2, 3);
Stream<String> stringStream = Stream.of("a");

integerStream.forEach(System.out::println);
System.out.println("---------------");
stringStream.forEach(System.out::println);

技术图片

1.1.2 generator

返回一个无限长度的Stream,其元素由Supplier接口的提供。在Supplier是一个函数接口,只封装了一个get()方法,其用来返回任何泛型的值,该结果在不同的时间内,返回的可能相同也可能不相同,没有特殊的要求。

Stream<Double> streamA = Stream.generate(new Supplier<Double>() {
@Override
public Double get() {
return java.lang.Math.random();
}
});
Stream<Double> streamB = Stream.generate(() -> java.lang.Math.random());
Stream<Double> streamC = Stream.generate(java.lang.Math::random);

streamA.limit(10).forEach(System.out::println);
System.out.println("---------------");
streamB.limit(10).forEach(System.out::println);
System.out.println("---------------");
streamC.limit(10).forEach(System.out::println);

技术图片

1.1.3 iterate

返回的是一个无限长度的Stream,与generate方法不同的是,其是通过函数f迭代对给指定的元素种子而产生无限连续有序Stream,其中包含的元素可以认为是:seed,f(seed),f(f(seed))无限循环。

Stream<Integer> stream = Stream.iterate(1, item -> item + 1);

stream.limit(10).forEach(System.out::println);

技术图片

1.1.4 empty

返回一个空的顺序Stream,该Stream里面不包含元素项。

Stream<Object> empty = Stream.empty();

empty.forEach(System.out::println);

技术图片

1.2 Collection接口和Arrays默认方法

1.2.1 Collection接口

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Stream<Integer> stream = list.stream();

stream.forEach(System.out::println);

技术图片

1.2.2 Arrays

int[] arr = {1,2,3};
IntStream stream = Arrays.stream(arr);

stream.forEach(System.out::println);

技术图片

 

 

 2. 中间操作

对Stream做出相应转换及限制流,即将原Stream转换为一个新的Stream。

2.1 concat

将两个Stream连接在一起,合成一个Stream。若两个输入的Stream都时排序的,则新Stream也是排序的;若输入的Stream中任何一个是并行的,则新的Stream也是并行的;若关闭新的Stream时,原两个输入的Stream都将执行关闭处理。

以上是关于Stream的主要内容,如果未能解决你的问题,请参考以下文章

从Node.js Stream写入多个文件

协议切换成功与否

java8 .stream().sorted().filter().map().collect()用法

Java8 Stream针对List先分组再求和最大值最小值平均值等

TS Stream 详解

Java-jxl插件Excel文件读写报错jxl.read.biff.BiffException: Unable to recognize OLE stream