JAVA基础-Stream流

news/2025/3/19 18:26:29/

引言

        Java 8 版本新增的Stream,配合同版本出现的Lambda ,给我们操作集合(Collection)提供了极大的 便利。Stream流是JDK8新增的成员,允许以声明性方式处理数据集合,可以把Stream流看作是遍历数据集 合的一个高级迭代器。Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操 作,可以执行非常复杂的查找/筛选/过滤、排序、聚合和映射数据等操作。使用Stream API 对集合数据进行 操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。

         简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

一,Stream流的特性

        Stream(流)是一个来自数据源的元素队列并支持聚合操作:

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

        和以前的Collection操作不同, Stream操作还有两个基础的特征:

  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格 (fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路(short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

        Stream可以由数组或集合创建,对流的操作分为两种:

1:中间操作,每次返回一个新的流,可以有多个

2:终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新 的集合或值。

特性:

  • 不是数据结构,不会保存数据。
  • 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。(保留意见:毕竟peek方法可 以修改流中元素)
  • 惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作 的时候才会进行实际的计算

二,Stream流的具体操作

2.1,Stream的创建

示例代码:
 

        //List集合List<String> list = Arrays.asList("a", "b", "c");// 创建一个顺序流(串行流)Stream<String> stream = list.stream();// 创建一个(并行流)(用于多线程)Stream<String> parallelStream = list.parallelStream();//使用数组创建int[] array={1,3,5,6,8};IntStream stream = Arrays.stream(array);

2.2,Stream流的常用方法:of()、generate(),iterate()

2.2.1,of()方法

        为给定元素创建顺序流:

示例代码:

        Stream<Integer> is=Stream.of(5,4,8,66,2,3);is.forEach(System.out::println);

输出结果:

2.2.2,generate()方法

         返回一个无限连续的无序流,其中每个元素由提供的供应商(Supplier)生成。generate方法用于生成常量流和随机元素流。

示例代码:

        Stream<Double> is=Stream.generate(Math::random).limit(4);is.forEach(System.out::println);

输出结果:

2.2.3,iterate()方法

        可以用来生成一个包含无限个元素的流。iterate的两个参数,第一个参数是新流中的初始元素,然后使用该数据做第二个参数也就是UnaryOperator函数的入参去计算第二元素,然后把新计算得到的第二个元素作为入参继续计算第三个元素,以此循环可以制造无限个元素。

示例代码:

        Stream<Integer> is=Stream.iterate(0,(e)->e+3).limit(5);is.forEach(System.out::println);

输出结果:

 2.3,Stream流的使用

 示例代码:

        //1-100以内素数的和int su=IntStream.rangeClosed(1,100).filter(e->{for (int i = 2; i < e; i++) {if (e%i==0){return false;}}return true;}).sum();System.out.println(su);

输出结果:


http://www.ppmy.cn/news/981006.html

相关文章

【数据结构】链表是否有环相关问题

文章目录 快指针走3、4、5步甚至更多可以吗为什么快慢指针一定在入口点相遇![在这里插入图片描述](https://img-blog.csdnimg.cn/ba346dbc9fee425dbb895ae2962e99ce.png) 快指针走3、4、5步甚至更多可以吗 部分情况下可以。 如果这样&#xff0c;相对&#xff08;追及&#xf…

微调模型来完成热狗识别的图像分类任务

我们来实践一个具体的例子&#xff1a;热狗识别。将基于一个小数据集对在ImageNet数据集上训练好的ResNet模型进行微调。该小数据集含有数千张热狗或者其他事物的图像。我们将使用微调得到的模型来识别一张图像中是否包含热狗。 首先&#xff0c;导入实验所需的工具包。 impo…

Centos7.6系统升级openssh

1.升级 首先&#xff0c;我需要强调&#xff0c;尽管我会提供基本的升级步骤&#xff0c;但在操作前&#xff0c;你需要确保已经创建了所有重要数据和配置的备份。升级过程中如果出现任何错误&#xff0c;可能会导致数据丢失。这是你需要做好的准备工作。 接下来&#xff0c;…

《CUDA C++ Programming Guide》第一章 CUDA介绍

第一章 CUDA介绍 1.1 使用GPUs的好处 在相同的价格和功耗范围内&#xff0c;图形处理器 GPU 比 CPU 提供了更高的指令吞吐量和内存带宽, 许多应用程序利用这些更高的功能在 GPU 上比在 CPU 上运行得更快。相比较其他计算设备&#xff0c;如 FPGA&#xff0c;也是非常节能的&a…

react经验4:动态组件

什么是动态组件&#xff1f; 在页面的一小块区域切换显示不同的组件 实现方法 1.声明示例组件 //写在component1.tsx中 const Component1()>{return (<div>组件1</div>) } //写在component2.tsx中 const Component2()>{return (<div>组件2</div…

(转载)PID神经元网络解耦控制算法(matlab实现)

​本博客的完整代码获取&#xff1a;https://www.mathworks.com/academia/books/book106283.html​ 1案例背景 1.1PID 神经元网络结构 PID神经元网络从结构上可以分为输人层、隐含层和输出层三层&#xff0c;n个控制量的PID神经元网络包含n个并列的相同子网络,各子网络间既相…

flask中redirect、url_for、endpoint介绍

flask中redirect、url_for、endpoint介绍 redirect 在 Flask 中&#xff0c;redirect() 是一个非常有用的函数&#xff0c;可以使服务器发送一个HTTP响应&#xff0c;指示客户端&#xff08;通常是浏览器&#xff09;自动导航到新的 URL。基本上&#xff0c;它是用来重定向用…

【C++】深入剖析list

本期我们来深入list的实现原理&#xff1a; 目录 一、STL中的list 二、list的模拟实现 2.1 搭建list的框架 2.2 list迭代器的实现 2.2.1 普通迭代器的实现 2.2.2 const类型迭代器的实现 2.2.3 迭代器中->运算符重载实现 2.3 其他功能函数的实现 2.3.1 insert 2.…