Java8提供强大的stream处理api,来操作数据源,对数据进行一系列处理,数据操作的思路类似于数据库的SQL操作,编码简单,执行效率高。
// 通过集合来获取
List integers = Arrays.asList(1,2,3);
Stream stream1 = integers.stream();
// 通过数组来获取
Integer[] integers1 = new Integer[]{4,5,6,7};
Stream stream2 =Arrays.stream(integers1);
// 通过数值来获取
Stream integers3 = Stream.of(8,9,10,11);
// 通过迭代获取流
Stream stream4 = Stream.generate(() -> Math.random()).limit(5);
Stream stream5 = Stream.iterate(1, (a) -> a+2).limit(5);
上述获取到的都是封装数据类型的stream,Java8也提供了基本数据类型的stream。
// 通过数组来获取
int[] integers1 = new int[]{4,5,6,7};
IntStream stream2 =Arrays.stream(integers1);
double[] double2 = new double[]{1.1d,2.2d,3.3d};
DoubleStream doubleStream = Arrays.stream(double2);
因为java集合中不能直接存在基本数据类型,所以无法通过集合的方式来生成基本数据类型stream,只可以通过数组的形式来获取。
Stream不会存储元素;
Stream不会改变源数据;
Stream是延迟执行的,只有Stream被调用获取结果的时候,才会执行;
int[] integers = new int[]{4,5,6,7};
IntStream intStream = Arrays.stream(integers).filter((a) -> {
System.out.println("predicate");
return a > 5;
});
// 如果不执行这行代码,运行不会有打印输出,Stream延迟执行
intStream.count();
中间操作生成的是各种类型的Stream,每个中间操作都返回一个Stream,这样对流的处理中,我们可以链式调用书写多个中间操作;终止操作返回的是我们想得到的结果,可以是各种数据类型和封装类型的结果;
中间操作:
filter()
map()
flatMap()
......
终止操作:
max()
count()
collect(Collectors.toSet());
forEach(System.out::print);
......
Stream map(Function super T, ? extends R> mapper);
map的参数是一个Function
函数式接口,实现从T 映射到 R的操作,并且map接口返回一个Stream
Stream flatMap(Function super T, ? extends Stream extends R>> mapper);
flatMap的参数同样是一个Function
函数式接口,不过实现的是从 T 映射到 Stream ,映射形成的多个Stream
会拼接一个Stream,最终接口返回的依然是一个Stream
;flatMap与map相比,多了一步,将多个Stream
拼接成一个Stream
的流程,这也就是flat(平的)的意义所在;
写一个例子,感觉一下两者的区别:
map方式
String[] words = new String[]{"Hello","World"};
Arrays.stream(words)
.filter((str) -> str.length() > 3)
.map((str) -> str.split("")) // 返回的是stream
.forEach(System.out::println);
打印的结果为:
[Ljava.lang.String;@1b28cdfa
[Ljava.lang.String;@eed1f14
flatMap方式
String[] words = new String[]{"Hello","World"};
Arrays.stream(words)
.filter((str) -> str.length() > 3)
.map((str) -> str.split("")) // stream
.flatMap((strs) -> Stream.of(strs)) // stream
.forEach(System.out::println);
打印的结果为:
H
e
l
l
o
W
o
r
l
d
List strings = Arrays.asList("A","B","C");
// 并行流
Stream parallelStream = strings.parallelStream();
// 顺序流
Stream stream = strings.stream();
在大数据的情况下,使用并行流可以提高数据处理的效率。Stream
对数据的操作方法与SQL
类似,提供了max、count、limit、distinct等API,具体可以参考官方文档;