在Java8中提供了新特性—流式操作,通过流式操作可以帮助我们对数据更快速的进行一些过滤、排序、去重、最大、最小等等操作并且内置了并行流将流划分成多个线程进行并行执行,提供更高效、快速的执行能力。接下来我们一起看看Java8为我们新增了哪些便捷呢?
什么是集合的流式操作?
流式操作:不是一个数据结构,不负责任何的数据存储
更像是一个迭代器,有序的获取到数据源中的每一个数据,并且可以对这些数据进行一些操作
流失操作的每一个方法,返回值都是返回的流本身
翻译:可以把流比作一个管道,管道中有很多过滤网
对集合做流式操作的三个步骤?
获取数据源:集合、数组
对数据进行处理的过程:过滤、排序、映射……(中间操作)
对流中数据的整合:转成集合、数量(最终操作)
映射
方法
- flatMap:相同元素合并或拆分h1
- map:将源数据转换成需要的数据类型或者进行指定的操作
- toMap:转换成需要的map集合
实践说明
flatMap:相同元素合并或拆分h1
map:将源数据转换成需要的数据类型或者进行指定的操作
要求输出内容:h,e,l,l,o,w,o,r,l,d
public static void main(String[] args) { String[] array = {"hello", "world"}; System.out.println(Arrays.stream(array).map(ele -> ele.split("")).flatMap(Arrays::stream).collect(Collectors.toList())); }
参考博客:
flatMap():Java8 FlatMap的使用_java flatmap_杨幂等的博客-CSDN博客
Map():这么简单,还不会使用java8 stream流的map()方法吗?_stream流的map方法_欧子有话说的博客-CSDN博客
toMap:转换成需要的map集合
public static void main(String[] args) { Stream<Person> stream = Data.getData().stream(); Map<String, Integer> maps = stream.collect(Collectors.toMap(Person::getName, Person::getScore)); System.out.println(maps); }
并行流
什么是并行流?
把流分成多个块,并行操作
为什么需要并行流?
集合做重复的操作,如果使用串行执行会相当耗时,因此一般会采用多线程来加快, Java8的提供了并发执行能力
方法
- parallel():并行流
- findAny:最先抢到cpu时间片的线程它所处理的数据段中的第一个数据,串行流结果等同于findFirst
- findFirst:流中的第一个元素(指集合中的第一个),并行流或串行流结果一致
实战说明
parallel():并行流
import com.example.Data; import java.util.Arrays; import java.util.stream.Collectors; import java.util.stream.LongStream; /** * @BelongsProject: StreamOperate * @BelongsPackage: PACKAGE_NAME * @CreateTime: 2023-05-01 21:12 * @Description: TODO * @Version: 1.0 */ public class ParalleStream { public static void main(String[] args) { long start = System.currentTimeMillis(); LongStream.rangeClosed(0L, 50000000000L).parallel().reduce(Long::sum); long end = System.currentTimeMillis(); System.out.println(end - start); } }
参考博客:Java 8 并行流(Parallel Stream) 介绍 - 简书
findAny和findFirst的区别是什么?
findAny:最先抢到cpu时间片的线程它所处理的数据段中的第一个数据,串行流结果等同于findFirst
findFirst:流中的第一个元素(指集合中的第一个),并行流或串行流结果一致
对于并行流中,findAny比findFirst效率更高
import com.example.Data; import java.util.Arrays; import java.util.stream.Collectors; import java.util.stream.LongStream; /** * @BelongsProject: StreamOperate * @BelongsPackage: PACKAGE_NAME * @CreateTime: 2023-05-01 21:12 * @Description: TODO * @Version: 1.0 */ public class ParalleStream { public static void main(String[] args) { System.out.println(Data.getData().parallelStream().findFirst()); System.out.println(Data.getData().stream().findFirst()); System.out.println(Data.getData().stream().findAny()); System.out.println(Data.getData().parallelStream().findAny()); } }