JAVA基础---Stream流

news/2024/9/24 4:59:41/

Stream流出现背景

背景

在Java8之前,通常用 fori、for each 或者 Iterator 迭代来重排序合并数据,或者通过重新定义 Collections.sorts的 Comparator 方法来实现,这两种方式对 大数量系统来说,效率不理想。

Java8 中添加了一个新的接口类 Stream,相当于高级版的 Iterator,通过Lambda 表达式对集合进行各种非常便利、高效的聚合操作(Aggregate Operation),或者大批量数据操作 (Bulk Data Operation)。Stream不仅可以通过串行的方式实现数据操作,还可以通过并行的方式处理大批量数据,提高数据的处理效率。

解释

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

  1. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

    select * from user where age >30

    流水线:

    空瓶子--》灌水---》盖盖子--》贴标签 --->一瓶农夫三拳

  2. Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

  3. 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

  4. 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

什么是Stream流

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

  1. <strong元素队列< strong="">元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。</strong元素队列<>

  2. 数据源 流的来源。 可以是集合,数组,I/O channel(nio new IO非阻塞式IO), 产生器generator 等。

  3. 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

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

  4. Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。

  5. 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

如何生成流

在 Java 8 中, 集合接口有两个方法来生成流:

stream() − 为集合创建串行流。

parallelStream() − 为集合创建并行流。

常用方法

for each(循环遍历)

java">public class StreamTest {public static void main(String[] args) {List<Integer> list= Arrays.asList(1,2,-2,3,4,5,6,7,8);//for eachlist.stream().forEach(System.out::println);}
}

运行结果

map

java">public class StreamTest {public static void main(String[] args) {List<Integer> list= Arrays.asList(1,2,-2,3,4,5,6,7,8);//for eachlist.stream().forEach(System.out::println);//list中的每个元素都乘以3然后再打印list.stream().map(integer -> integer*3)//map表示对什么进行操作,箭头前面为数据,箭头后面为对数据进行的操作.forEach(System.out::println);}
}

运行结果

fliter

java">public class StreamTest {public static void main(String[] args) {List<Integer> list= Arrays.asList(1,2,-2,3,4,5,6,7,8);//for eachlist.stream().forEach(System.out::println);//list中的每个元素都乘以3然后再打印list.stream().map(integer -> integer*3)//map表示对什么进行操作,箭头前面为数据,箭头后面为对数据进行的操作.forEach(System.out::println);System.out.println("======================使用过滤器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>7).forEach(System.out::println);}
}

运行结果

limit

java">public class StreamTest {public static void main(String[] args) {List<Integer> list= Arrays.asList(1,2,-2,3,4,5,6,7,8);//for eachlist.stream().forEach(System.out::println);//list中的每个元素都乘以3然后再打印list.stream().map(integer -> integer*3)//map表示对什么进行操作,箭头前面为数据,箭头后面为对数据进行的操作.forEach(System.out::println);System.out.println("======================使用过滤器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>7).forEach(System.out::println);System.out.println("======================使用限制器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>7).limit(3)//限制只输出3个元素(前三个).forEach(System.out::println);}
}

运行结果

sorted

java">public class StreamTest {public static void main(String[] args) {List<Integer> list= Arrays.asList(1,2,-2,3,4,5,6,7,8);//for each        list.stream().forEach(System.out::println);//list中的每个元素都乘以3然后再打印list.stream().map(integer -> integer*3)//map表示对什么进行操作,箭头前面为数据,箭头后面为对数据进行的操作.forEach(System.out::println);System.out.println("======================使用过滤器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>7).forEach(System.out::println);System.out.println("======================使用限制器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>7).limit(3)//限制只输出3个元素(前三个).forEach(System.out::println);System.out.println("======================使用排序器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>-100).sorted()//默认从小到大排序.limit(6)//限制只输出3个元素(前三个).forEach(System.out::println);}
}

运行结果

并行流与串行流

parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:

Collectors

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

写在最后:流式编程是JAVA中一种很重要的编程思想,希望大家能够重视,这对提高代码效率十分有帮助。


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

相关文章

python安装cx_Oracle 遇到的问题

重要&#xff1a; 搞了一天&#xff0c;最后发现是python的版本和cx_Oracle版本对不上。 一开始安装的python版本是3.12&#xff0c;而cx_Oracle的最新版本是8.3.0&#xff0c; 对应的python版本为3.10&#xff0c;因此将python版本降低为3.10&#xff0c; 执行 pip install cx…

使用Maven将SpringBoot项目打成jar包

Maven打包最为推荐方式&#xff0c;方便快捷 项目右侧点击Maven&#xff0c;然后在Lifecycle下&#xff0c;点击install

Nginx自定义状态码499出现原因

499状态码定义 维基百科的定义 499 Client Closed Request (Nginx) Used in Nginx logs to indicate when the connection has been closed by client while the server is still processing itsrequest, making server unable to send a status code back 499状态码是nginx自…

InternVL——GPT-4V 的开源替代方案

您的浏览器不支持 video 标签。 在人工智能领域&#xff0c;InternVL 无疑是一颗耀眼的新星。它被认为是最接近 GPT-4V 表现的可商用开源模型&#xff0c;为我们带来了许多惊喜。 InternVL 具备强大的功能&#xff0c;不仅能够处理图像和文本数据&#xff0c;还能精妙地理解…

Llama3 mac本地部署教程

1.下载的软件清单&#xff1a; ollama下载&#xff1a; Download Ollama on macOS nodejs下载&#xff1a; Node.js — Download Node.js 2.安装 安装Ollama 下载之后打开&#xff0c;直接点击Next以及Install安装ollama到命令行。安装完成后界面上会提示ollama run llam…

拆单算法交易(Algorithmic Trading)

TWAP TWAP交易时间加权平均价格Time Weighted Average Price 模型&#xff0c;是把一个母单的数量平均地分配到一个交易时段上。该模型将交易时间进行均匀分割&#xff0c;并在每个分割节点上将拆分的订单进行提交。例如&#xff0c;可以将某个交易日的交易时间平均分为N 段&am…

前端请求没问题,后端正常运行,但查不出数据

写代码时写得快了些&#xff0c;Orders.的订单状态写错了CONFIRMED 改成COMPLETED

Jammy@Jetson Orin Nano - Tensorflow GPU版本安装

JammyJetson Orin Nano - Tensorflow GPU版本安装 1. 源由2. 问题3. 分析3.1 当前版本Tensorflow 2.16.13.2 GPU版本二进制安装3.3 GPU版本源代码安装3.3.1 问题1 ERROR: no such target //tensorflow/tools/pip_package:wheel3.3.2 问题2 fatal error: cstddef file not found…