Java8流处理

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

如果获取stream?
// 通过集合来获取
List<Integer> integers = Arrays.asList(1,2,3);
Stream<Integer> stream1 = integers.stream();

// 通过数组来获取
Integer[] integers1 = new Integer[]{4,5,6,7};
Stream<Integer> stream2 =Arrays.stream(integers1);

// 通过数值来获取
Stream<Integer> integers3 = Stream.of(8,9,10,11);

// 通过迭代获取流
Stream<Double> stream4 = Stream.generate(() -> Math.random()).limit(5);
Stream<Integer> 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的中间操作和终止操作

在这里插入图片描述

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

中间操作:

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

终止操作:

max()
count()
collect(Collectors.toSet());
forEach(System.out::print);
......
中间操作map和flatMap的区别
map的接口声明:
 <R> Stream<R> map(Function<? super T, ? extends R> mapper);

map的参数是一个Function函数式接口,实现从T 映射到 R的操作,并且map接口返回一个Stream<R>
在这里插入图片描述

flatMap的接口声明:
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

flatMap的参数同样是一个Function函数式接口,不过实现的是从 T 映射到 Stream ,映射形成的多个Stream<R>会拼接一个Stream,最终接口返回的依然是一个Stream<R>;flatMap与map相比,多了一步,将多个Stream<R>拼接成一个Stream<R>的流程,这也就是flat(平的)的意义所在;
在这里插入图片描述
写一个例子,感觉一下两者的区别:
map方式

String[] words = new String[]{"Hello","World"};
Arrays.stream(words)
		.filter((str) -> str.length() > 3)
		.map((str) -> str.split(""))  // 返回的是stream<String[]>
		.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<String[]>
		.flatMap((strs) -> Stream.of(strs)) // stream<String>
		.forEach(System.out::println);

打印的结果为:

H
e
l
l
o
W
o
r
l
d
并行流和顺序流
List<String> strings = Arrays.asList("A","B","C");
// 并行流
Stream<String> parallelStream = strings.parallelStream();
// 顺序流
Stream<String> stream = strings.stream();

在大数据的情况下,使用并行流可以提高数据处理的效率。Stream对数据的操作方法与SQL类似,提供了max、count、limit、distinct等API,具体可以参考官方文档;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值