Stream API

Java 8 引入的 Stream API 是处理集合数据的强大工具,它允许你以声明式方式处理数据集合,支持各种聚合操作和并行处理。以下是 Stream API 的核心知识点及具体代码示例:

1. Stream 概述

Stream 是数据渠道,用于操作数据源(如集合、数组)所生成的元素序列。注意

  • Stream 自己不会存储元素。
  • Stream 不会改变源对象,相反,它们会返回一个持有结果的新 Stream。
  • Stream 操作是延迟执行的,这意味着它们会等到需要结果时才执行。

2. Stream 的创建

可以通过集合、数组、静态方法等创建 Stream。

import java.util.*;
import java.util.stream.*;public class StreamCreation {public static void main(String[] args) {// 1. 通过 Collection 接口的 stream() 或 parallelStream() 方法List<String> list = Arrays.asList("apple", "banana", "cherry");Stream<String> streamFromList = list.stream(); // 顺序流Stream<String> parallelStream = list.parallelStream(); // 并行流// 2. 通过 Arrays 类的 stream() 方法Integer[] array = {1, 2, 3, 4, 5};Stream<Integer> streamFromArray = Arrays.stream(array);// 3. 通过 Stream 类的静态方法:of()、iterate()、generate()Stream<String> streamOf = Stream.of("a", "b", "c");Stream<Integer> streamIterate = Stream.iterate(0, n -> n + 2).limit(5); // 0, 2, 4, 6, 8Stream<Double> streamGenerate = Stream.generate(Math::random).limit(3);// 4. 创建空 StreamStream<String> emptyStream = Stream.empty();}
}

3. Stream 的中间操作

中间操作会返回一个新的 Stream,多个中间操作可以连接成一个流水线。常用操作:

  • 过滤filter(Predicate<T>)
  • 映射map(Function<T, R>)flatMap(Function<T, Stream<R>>)
  • 排序sorted()sorted(Comparator<T>)
  • 去重distinct()
  • 截断limit(long maxSize)
  • 跳过skip(long n)
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;public class StreamIntermediateOperations {public static void main(String[] args) {List<String> words = Arrays.asList("hello", "world", "java", "stream");// 过滤长度大于4的单词,并转为大写,最后排序Stream<String> result = words.stream().filter(word -> word.length() > 4)     // 过滤长度>4的单词.map(String::toUpperCase)             // 转为大写.sorted();                            // 自然排序result.forEach(System.out::println);      // 输出: HELLO, WORLD, STREAM}
}

4. Stream 的终止操作

终止操作会触发流水线的执行并产生结果。常用操作:

  • 遍历forEach(Consumer<T>)
  • 匹配allMatch()anyMatch()noneMatch()
  • 查找findFirst()findAny()
  • 归约reduce()
  • 收集collect()
  • 统计count()max()min()
import java.util.*;
import java.util.stream.Collectors;public class StreamTerminalOperations {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 1. 匹配与查找boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0); // falseboolean anyEven = numbers.stream().anyMatch(n -> n % 2 == 0); // trueOptional<Integer> firstEven = numbers.stream().filter(n -> n % 2 == 0).findFirst(); // 2// 2. 归约:计算总和int sum = numbers.stream().reduce(0, Integer::sum); // 55// 3. 收集:转为集合或统计List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList()); // [2, 4, 6, 8, 10]// 4. 分组:按奇偶分组Map<Boolean, List<Integer>> groupedByEven = numbers.stream().collect(Collectors.partitioningBy(n -> n % 2 == 0));// 5. 统计IntSummaryStatistics stats = numbers.stream().mapToInt(Integer::intValue).summaryStatistics();System.out.println("Count: " + stats.getCount());     // 10System.out.println("Sum: " + stats.getSum());         // 55System.out.println("Average: " + stats.getAverage()); // 5.5}
}

5. 并行流与串行流

  • 串行流:单线程处理流中的元素。
  • 并行流:内部使用 Fork/Join 框架多线程并行处理(适合大数据量)。
import java.util.Arrays;
import java.util.List;public class ParallelStreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 串行流(单线程)numbers.stream().map(n -> {System.out.println(Thread.currentThread().getName() + ": " + n);return n * 2;}).forEach(System.out::println);System.out.println("---");// 并行流(多线程)numbers.parallelStream().map(n -> {System.out.println(Thread.currentThread().getName() + ": " + n);return n * 2;}).forEach(System.out::println);}
}

6. Stream 的惰性求值

中间操作不会立即执行,只有遇到终止操作时才会触发执行。

import java.util.Arrays;
import java.util.List;public class StreamLaziness {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 中间操作不会执行names.stream().filter(name -> {System.out.println("Filtering: " + name);return name.length() > 4;}).map(name -> {System.out.println("Mapping: " + name);return name.toUpperCase();});// 没有终止操作,不会输出任何内容// 添加终止操作后触发执行names.stream().filter(name -> {System.out.println("Filtering: " + name);return name.length() > 4;}).map(name -> {System.out.println("Mapping: " + name);return name.toUpperCase();}).forEach(System.out::println);}
}

总结

Stream API 的核心流程:创建 Stream → 中间操作(过滤、映射等)→ 终止操作(收集结果)。合理使用 Stream 可以让代码更简洁、更具可读性,同时利用并行流提升大数据处理效率。

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

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

相关文章

相机参数的格式与作用

在计算机视觉中&#xff0c;相机标定是非常重要的一步&#xff0c;主要目的是从图像中恢复出物体的三维信息。为了做到这一点&#xff0c;我们需要了解和使用一系列的数学工具&#xff0c;这些工具描述了相机的成像过程&#xff0c;包括相机的内参、外参、畸变系数、投影矩阵和…

【jvm|基本原理】第四天

摘要&#xff1a;本文简单分析了Java虚拟机的核心运行机制。首先介绍了基本数据类型在32位和64位虚拟机中的存储差异&#xff0c;说明slot槽设计以空间换时间的优化思路。其次详细解析了对象在堆内存中的存储结构&#xff0c;包括对象头、对象数据和对齐填充机制。然后探讨了方…

Git高级操作与最佳实践详解

前言 熟练掌握Git的高级操作可以显著提高开发效率&#xff0c;优化工作流程&#xff0c;解决复杂问题。本文将详细介绍Git的高级操作技巧与最佳实践&#xff0c;帮助开发者更加高效地管理代码和协作开发。 1. 提交历史管理 1.1 修改最近的提交 # 修改最近的提交信息 git co…

ElasticSearch:商品SKU+SPU实现join查询,设计及优化

文章目录一、SPUSKU1、商品SPU和SKU2、SPU和SKU的关系3、实现SPUSKU父子嵌套查询1. **嵌套对象&#xff08;Nested Objects&#xff09;**2. **父子关系&#xff08;Parent-Child&#xff09;**3. **应用层关联&#xff08;Application-Side Join&#xff09;**&#xff08;推荐…

Objective-c 初阶 —— Runtime(方法交换 消息传递)

一、消息传递1、什么是消息[a func1];我们会把这种用方括号来调函数的方式称为发消息。对于这个例子&#xff0c;就相当于我们给 a 这个对象发了个 func1 的消息&#xff08;个人认为指令更好理解&#xff09;。2、什么是 selectorselector 就是一个函数区分器。它只会给这个方…

【计算机网络架构】树型架构简介

引言在当今数字化时代&#xff0c;网络架构如同复杂的神经系统&#xff0c;支撑着各种信息的流通与交互。从个人日常的网络浏览、在线购物&#xff0c;到企业的远程办公、数据存储&#xff0c;再到国家层面的政务信息化、智慧城市建设&#xff0c;网络架构都扮演着不可或缺的角…

llama-factory快速开始

llama-factory快速开始 文章目录llama-factory快速开始前言一、环境配置1.1 训练顺利运行需要包含4个必备条件1.2 llama-factory下载1.3 环境下载1.4 硬件环境校验二、启动前言 https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md这是GitHub中文介绍文档&#…

408数据结构强化(自用)

常用代码片段&#xff08;持续更新&#xff09;折半查找void SearchBinary(int A[];int x){int low 0, high n-1, mid;while(low<high){mid (lowhigh)/2;if(A[mid]x) break;else if(A[mid] < x) low mid 1;else high mid - 1;}顺序表逆置void Reverse(SqList &…

linux cpu频率和AVS调压等级

1&#xff0c;linux常见的cpu频率对应的电压等级对应参数表如下:频率&#xff08;GHz&#xff09;电压&#xff08;V&#xff09;1.61.41.41.21.21.01.00.82&#xff0c;avs调压的几种方式linux内核宏解释Linux内核中&#xff0c;AVS调压的实现依赖于一些宏定义和配置选项&…

Input输入和Screen相关

知识点using System.Collections; using System.Collections.Generic; using UnityEngine;public class Lesson11 : MonoBehaviour {// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){#region 注意&#xff0c…

如何在CSDN变现?如何赚钱?如何涨粉?如何找到优质大V博主合作伙伴?

&#x1f525; 2025最新 如何在CSDN变现&#xff1f;如何赚钱&#xff1f;如何跟对人&#xff1f;如何找到优质博主合作伙伴&#xff1f; 大家好&#xff0c;我是猫头虎&#xff0c;今天✍️想和大家聊聊在CSDN平台变现的问题。这也是绝大多数伙伴非常关心的一个话题——其实&…

OpenCV特征点提取算法orb、surf、sift对比

下面是 OpenCV 中三种常用特征点提取算法&#xff1a;ORB、SURF 和 SIFT 的详细对比&#xff0c;从 算法原理、性能、使用限制 和 适用场景 多维度进行总结&#xff0c;帮助大家在实际项目中合理选择。一览表&#xff1a;ORB vs. SURF vs. SIFT属性/算法ORBSURFSIFT全称Oriente…

LeafletJS 与 React:构建现代地图应用

引言 LeafletJS 是一个轻量、灵活的 JavaScript 地图库&#xff0c;广泛用于创建交互式 Web 地图&#xff0c;而 React 作为现代前端框架&#xff0c;以其组件化、状态管理和虚拟 DOM 特性&#xff0c;成为构建动态用户界面的首选工具。将 LeafletJS 与 React 结合&#xff0c…

前后端数据交互,关于表单数据传输问题

表单提交var formData new FormData(); // 添加每个事故ID作为单独的参数 accidentIds.forEach(id > formData.append(accidentIds, id)); formData.append(status, statusText); $.messager.confirm(确认, 确定要将事故记录标记为 statusText 吗&#xff1f;, function …

新书推介 | 吉林大学出版教材《汽车智能辅助驾驶系统技术》,国产仿真工具链GCKontrol-GCAir教学应用

近日&#xff0c;吉林大学出版了由高镇海教授、孙天骏副教授主编的新教材《汽车智能辅助驾驶系统技术》&#xff0c;本书系统地介绍了汽车智能辅助驾驶系统的发展需求、物理架构、功能算法、技术原理以及应用场景。在教材第17章《仿真测试》&#xff0c;应用国产化GCKontrol-GC…

从 0 到 1 玩转 XSS - haozi 靶场:环境搭建 + 全关卡漏洞解析

文章目录前言靶场地址0X00 直接注入0X01 闭合标签10X02 闭合标签20X03 绕过特殊符号10X04 绕过特殊符号20X05 绕过注释符0X06 绕过更多符号0X07 绕过更多符号20X08 绕过闭合符号0X09 绕过URL匹配0X0A 绕过URL过滤0X0B 绕过大写转换10X0C 绕过大写转换20X0D 绕过注释0X0E 古英语…

TF卡格式化

cmd 输入diskpart,在新打开的窗口输入list disk&#xff0c;然后select disk [磁盘号]&#xff0c;clean&#xff0c;回车变成未分区的。再选中磁盘&#xff0c;选中之后create partition [分区名] 回车&#xff0c;list partition&#xff0c;查看分区&#xff0c;输入active&…

Python爬虫实战:研究sqlparse库相关技术

1. 引言 1.1 研究背景与意义 在当今数据驱动的时代,SQL 作为关系型数据库的标准查询语言,被广泛应用于各种数据处理和分析场景。随着数据库应用的不断发展,SQL 代码的规模和复杂度也在不断增加,这给 SQL 代码的编写、维护和优化带来了挑战。 研究表明,低效的 SQL 查询是…

全球天气预报5天(经纬度版)免费API接口教程

本文全面介绍由接口盒子免费API提供的全球天气预报API&#xff0c;支持通过经纬度坐标获取任意地区未来5天的详细天气预报数据。 一、接口核心功能 ​全球覆盖​&#xff1a;支持全球任意经纬度坐标点的天气预报​高精度预报​&#xff1a;提供每3小时为间隔的精细化预报&…

5 基于STM32单片机的绝缘检测系统设计(STM32代码编写+手机APP设计+PCB设计+Proteus仿真)

系列文章目录 文章目录 系列文章目录前言1 1 资料获取与演示视频1.1 资料介绍1.2 资料获取1.3 演示视频 2 系统框架3 硬件3.1 主控制器3.2 显示屏3.3 WIFI模块3.4 DHT11温湿度传感器3.5 可调电位器 4 设计PCB4.1 安装下载立创EDA专业版4.2 画原理图4.3 摆放元器件&#xff0c;设…