Java8新特性-流式操作

在Java8中提供了新特性—流式操作,通过流式操作可以帮助我们对数据更快速的进行一些过滤、排序、去重、最大、最小等等操作并且内置了并行流将流划分成多个线程进行并行执行,提供更高效、快速的执行能力。接下来我们一起看看Java8为我们新增了哪些便捷呢?

目录

什么是集合的流式操作?

对集合做流式操作的三个步骤?

映射

flatMap:相同元素合并或拆分h1

map:将源数据转换成需要的数据类型或者进行指定的操作

toMap:转换成需要的map集合

并行流

什么是并行流?

为什么需要并行流?

parallel():并行流

findAny和findFirst的区别是什么?

findAny:最先抢到cpu时间片的线程它所处理的数据段中的第一个数据,串行流结果等同于findFirst

findFirst:流中的第一个元素(指集合中的第一个),并行流或串行流结果一致


什么是集合的流式操作?

流式操作:不是一个数据结构,不负责任何的数据存储

更像是一个迭代器,有序的获取到数据源中的每一个数据,并且可以对这些数据进行一些操作

流失操作的每一个方法,返回值都是返回的流本身

翻译:可以把流比作一个管道,管道中有很多过滤网

对集合做流式操作的三个步骤?

获取数据源:集合、数组

对数据进行处理的过程:过滤、排序、映射……(中间操作)

对流中数据的整合:转成集合、数量(最终操作)


映射

方法

  • 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());
    }
}
 
 

相关博客

Java8流式操作——中间操作

Java8流式操作——最终操作

Java流式操作——Collectors工具类

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~

猜你喜欢

转载自blog.csdn.net/weixin_43319713/article/details/130462381