# JAVA中的Stream学习

news2024/12/22 0:38:58

JAVA中的Stream

1、Stream是什么?

  • Stream 是 Java 8 引入的一个新的抽象层,用于处理数据集合。
  • 它可以让你以声明式的方式处理数据,类似于 SQL 语句的查询方式。

2、Stream能够做什么?

  • 过滤:通过条件筛选数据。
  • 映射:转换数据结构或类型。
  • 排序:对数据进行排序。
  • 聚合:如求和、最大值、最小值等。
  • 匹配与查找:检查某些条件是否满足,或者查找特定元素。

3、Stream能给我带来什么好处?

  • 简洁性:使用 Stream 可以让代码更加简洁、易读。
  • 高效性:Stream 操作可以自动并行化,提高处理效率。
  • 声明式编程:关注“做什么”而不是“怎么做”,降低出错概率。

4、Stream怎么使用?

1. 创建 Stream

从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
从数组创建
int[] array = {1, 2, 3};
IntStream stream = Arrays.stream(array);
从文件创建
try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
    lines.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

2. 中间操作

filter

  • 功能:过滤元素,只保留满足条件的元素。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> shortNames = names.stream()
                               .filter(name -> name.length() < 5)
                               .collect(Collectors.toList());

map

  • 功能:转换元素,将每个元素映射为另一个元素。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> squares = numbers.stream()
                               .map(n -> n * n)
                               .collect(Collectors.toList());

flatMap

  • 功能:将多个流合并成一个流。
  • 示例:
List<List<Integer>> listOfLists = Arrays.asList(
    Arrays.asList(1, 2),
    Arrays.asList(3, 4)
);
List<Integer> flattenedList = listOfLists.stream()
                                         .flatMap(List::stream)
                                         .collect(Collectors.toList());

distinct

  • 功能:去重,去除重复的元素。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4);
List<Integer> uniqueNumbers = numbers.stream()
                                     .distinct()
                                     .collect(Collectors.toList());

sorted

  • 功能:排序,对元素进行排序。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> sortedNames = names.stream()
                                .sorted()
                                .collect(Collectors.toList());

limit

  • 功能:限制流的大小,返回前 n 个元素。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> firstFive = numbers.stream()
                                 .limit(5)
                                 .collect(Collectors.toList());

skip

  • 功能:跳过前 n 个元素。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> afterFirstFive = numbers.stream()
                                      .skip(5)
                                      .collect(Collectors.toList());

3. 终端操作

forEach

  • 功能:遍历流中的每个元素。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(System.out::println);

collect

  • 功能:收集结果,将流转换为其他形式的数据结构。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filterNames = names.stream()
                               .filter(name -> name.length() < 5)
                               .collect(Collectors.toList());

reduce

  • 功能:聚合操作,将流中的元素减少为一个值。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream().reduce(0, Integer::sum);

anyMatch

  • 功能:检查流中是否有任何元素满足给定的条件。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean anyStartsWithA = names.stream()
                              .anyMatch(name -> name.startsWith("A"));

allMatch

  • 功能:检查流中所有元素是否都满足给定的条件。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean allStartWithA = names.stream()
                             .allMatch(name -> name.startsWith("A"));

noneMatch

  • 功能:检查流中没有任何元素满足给定的条件。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean noneStartWithZ = names.stream()
                              .noneMatch(name -> name.startsWith("Z"));

findFirst

  • 功能:返回流中的第一个元素。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> first = names.stream()
                              .findFirst();

findAny

  • 功能:返回流中的任意一个元素。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> any = names.stream()
                            .findAny();

count

  • 功能:返回流中元素的数量。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream()
                  .count();

max

  • 功能:返回流中的最大值。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Optional<Integer> max = numbers.stream()
                               .max(Integer::compare);

min

  • 功能:返回流中的最小值。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Optional<Integer> min = numbers.stream()
                               .min(Integer::compare);

toArray

  • 功能:将流转换为数组。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
String[] array = names.stream()
                      .toArray(String[]::new);

5、Stream的原理是什么?

  • 惰性求值:中间操作不会立即执行,只有在终端操作时才会触发整个流水线的执行。
  • 内部迭代:由系统控制迭代过程,而不是显式地编写循环。
  • 并行处理:支持并行流,可以通过 parallelStream() 方法实现。
  • 操作类型:中间操作返回新的 Stream,终端操作触发执行并产生结果。
  • 生命周期:从创建到中间操作再到终端操作,形成完整的流处理流程。

6、Stream总结

  • Stream 是 Java 8 引入的强大工具,简化了集合数据的处理。
  • 通过声明式编程风格,使代码更加简洁、易读。
  • 支持惰性求值和内部迭代,提高了性能和并发处理能力。
  • 在实际开发中,合理使用 Stream 可以显著提升开发效率和代码质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s上部署redis高可用集群

介绍&#xff1a; Redis Cluster通过分片&#xff08;sharding&#xff09;来实现数据的分布式存储&#xff0c;每个master节点都负责一部分数据槽&#xff08;slot&#xff09;。 当一个master节点出现故障时&#xff0c;Redis Cluster能够自动将故障节点的数据槽转移到其他健…

计算机网络——路由选择算法

路由算法 路由的计算都是以子网为单位计算的——找到从原子网到目标子网的路径 链路状态算法

4.3 Java JNI 机制

1 绪论 JNI 是一个原生编程接口。它允许在 Java 虚拟机&#xff08;JVM&#xff09;内运行的 Java 代码与用其它编程语言&#xff08;如 C、C 和汇编&#xff09;编写的应用程序和库进行互操作。 JNI 最重要的好处是它对底层 JVM 的实现没有限制。因此&#xff0c;JVM 供应商可…

influxDB 时序数据库安装 flux语法 restful接口 nodjsAPI

安装 Install InfluxDB | InfluxDB OSS v2 Documentation Debian和Ubuntu用户可以用apt-get包管理来安装最新版本的InfluxDB。 对于Ubuntu用户&#xff0c;可以用下面的命令添加InfluxDB的仓库&#xff0c;添加之后即可apt-get 安装influxdb2 wget -q https://repos.influx…

7z 解压器手机版与解压专家:安卓解压工具对决

7z 解压器手机版和解压专家都是在安卓设备上广受欢迎的解压软件。7z 解压器手机版由深圳乡里云网络科技有限公司开发&#xff0c;大小为 32.8M&#xff0c;支持多种常见的压缩文件格式&#xff0c;如.zip、.rar、.7z 等。 它对安卓操作系统的特性和用户习惯进行了优化&#xf…

亮数据——助力全球数据抓取的高效代理平台

目录 实际案例&#xff1a;利用代理服务抓取企业信息完整代码运行结果 亮数据的技术优势与应用场景产品更新&#xff1a;简化注册流程与智能助手升级立即注册&#xff0c;开启您的数据抓取之旅&#xff01; 在如今的大数据时代&#xff0c;企业决策越来越依赖于数据分析&#x…

设计模式之责任链模式(Chain Of Responsibility)

一、责任链模式介绍 1、责任链模式介绍 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在 一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链 传递请求&#xff0c;直到有一个对…

【月之暗面kimi-注册/登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

低代码牵手 AI 接口:开启智能化开发新征程

一、低代码与 AI 接口的结合趋势 低代码开发平台近年来在软件开发领域迅速崛起。随着企业数字化转型的需求不断增长&#xff0c;低代码开发平台以其快速构建应用程序的优势&#xff0c;满足了企业对高效开发的需求。例如&#xff0c;启效云低代码平台通过范式化和高颗粒度的可配…

安培环路定理

回忆 静电场中的回路定理&#xff1a;→静电场是保守场 安培环路定理 1、圆形回路包围无限长载流直导线 &#xff08;1&#xff09;回路逆时针 &#xff08;2&#xff09;回路顺时针 规定&#xff1a; 回路正向由右手螺旋定则判断&#xff08;根据回路绕行方向&#xff0c;…

IDEA 2024.3正式版发布,速览新功能!

0 前言 IntelliJ IDEA 2024.3 引入了一系列可以提升您的开发体验的强大新功能。 IDE 现在提供代码逻辑结构的表示&#xff0c;简化了 Kubernetes 应用程序的调试体验&#xff0c;引入了集群范围的 Kubernetes 日志访问。 1 关键亮点 1.1 Structure工具窗口中的 Logical代码结…

LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)

1. 背景介绍 在数据分析和图像处理领域&#xff0c;经常需要查找给定点的最近邻居点。在LabVIEW中&#xff0c;计算二维平面上多个点之间的欧氏距离&#xff0c;并返回距离最近的几个点是一种常见操作。find_nearest_neighbors 函数用于实现这个功能。 2. 欧氏距离计算 在二维…

LeetCode 单调栈 下一个更大元素 I

下一个更大元素 I nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。 对于每个 0 < i < nums1.length…

vue的组件使用

1.安装element plus组件库 npm install element-plus --save

2024-11-14 算法学习及论文辅导(每日更新,随时联系)

看看学习小群的学习氛围&#x1f447;&#x1f3fb; 很多同学自己学习遇到问题没人解决&#xff0c;最终消耗了时间&#xff0c;精力同时大大消耗了自己对学习的信心&#x1f627; &#x1f973;来看看跟班学习&#xff0c;大家遇到问题的时候是怎么解决的&#xff1a; 首先…

开源三代示波器的高速波形刷新方案开源,支持VNC远程桌面,手机,Pad,电脑均可访问(2024-11-11)

说明&#xff1a; 1、本来这段时间是一年一度Hackaday硬件设计开源盛宴&#xff0c;但hackaday电子大赛在去年终结了。所以我开源个我的吧。 2、三代示波器的高速波形刷新方案&#xff0c;前两年就做好了&#xff0c;这两年忙H7-TOOL的更新比较多&#xff0c;三代示波器的更新…

B-树特点以及插入、删除数据过程

B树&#xff08;B-Tree&#xff09;是一种自平衡的多路查找树&#xff0c;它广泛应用于数据库索引和文件系统中&#xff0c;尤其适用于外部存储设备&#xff08;如磁盘&#xff09;。B树的设计使得它能够高效地存储大量数据并支持高效的插入、删除和查询操作。以下是B树的主要特…

微信小程序自定义tabbar;禁用某个tab;修改某个tab的样式

微信小程序自定义tabbar&#xff1b;禁用某个tab&#xff1b;修改某个tab的样式 原本使用本身的tabBar就已经很舒服了&#xff0c;很合适了的&#xff0c;但是总有一些脑洞大开的产品和客户&#xff0c;给你搞点多样式&#xff0c;没办法牛马就得去做咯&#xff0c;现在就给大…

操作系统——内存段式和段页式管理

目录 一、为什么要有段式管理&#xff1f; 二、段式管理的实现原理 1、段式虚拟空间 2、段式管理的内存分配与释放 3、段式管理的地址变换 &#xff08;1&#xff09;段表 &#xff08;2&#xff09;动态地址变换 4、段的共享与保护 &#xff08;1&#xff09;共享 &a…

【C#设计模式(10)——装饰器模式(Decorator Pattern)】

前言 装饰器模式可以在运行时为对象添加额外的功&#xff0c;而无需修改原始对象的代码。这种方式比继承更加灵活。 代码 //蛋糕类&#xff08;抽象类&#xff09; public abstract class Cake {public abstract void Create(); } //奶油蛋糕类 public class CreamCake : Cak…