Java8流处理

Java8提供强大的stream处理api,来操作数据源,对数据进行一系列处理,数据操作的思路类似于数据库的SQL操作,编码简单,执行效率高。

如果获取stream?
// 通过集合来获取
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是延迟执行的,只有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的中间操作和终止操作

Java8流处理_第1张图片

中间操作生成的是各种类型的Stream,每个中间操作都返回一个Stream,这样对流的处理中,我们可以链式调用书写多个中间操作;终止操作返回的是我们想得到的结果,可以是各种数据类型和封装类型的结果;

中间操作:

filter()
map()
flatMap()
......

终止操作:

max()
count()
collect(Collectors.toSet());
forEach(System.out::print);
......
中间操作map和flatMap的区别
map的接口声明:
  Stream map(Function mapper);

map的参数是一个Function函数式接口,实现从T 映射到 R的操作,并且map接口返回一个Stream
Java8流处理_第2张图片

flatMap的接口声明:
 Stream flatMap(Function> mapper);

flatMap的参数同样是一个Function函数式接口,不过实现的是从 T 映射到 Stream ,映射形成的多个Stream会拼接一个Stream,最终接口返回的依然是一个Stream;flatMap与map相比,多了一步,将多个Stream拼接成一个Stream的流程,这也就是flat(平的)的意义所在;
Java8流处理_第3张图片
写一个例子,感觉一下两者的区别:
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,具体可以参考官方文档;

你可能感兴趣的:(java)