Java 8的Stream API

embedded/2025/2/8 6:40:28/

引言

Java 8引入了Stream API,这是对Java集合操作的一次重大革新。Stream API提供了一种高效且易于使用的方式来处理数据集合,特别是通过支持函数式编程风格,使得代码更加简洁和可读。

Stream API简介

 什么是Stream?

Stream是Java 8中引入的一个新抽象,它允许你以声明式的方式处理数据集合。Stream可以看作是对集合的高级迭代器,但它不仅仅是一个迭代器,它还提供了丰富的操作,如过滤、映射、排序、聚合等。

Stream的特点

  • 惰性求值:Stream的操作是惰性的,只有在终端操作执行时才会真正开始处理数据。

  • 不可变性:Stream不会修改源数据,所有的操作都会生成一个新的Stream。

  • 并行处理:Stream API天然支持并行处理,可以轻松地将顺序流转换为并行流。

 Stream API的基本操作

创建Stream

Stream可以通过多种方式创建,常见的包括:

  • 从集合创建:List.stream()

  • 从数组创建:Arrays.stream(array)

  • 使用Stream的静态方法:Stream.of()

java">List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

中间操作

中间操作是对Stream进行处理的步骤,常见的中间操作包括:

  • filter(Predicate):过滤元素

  • map(Function):将元素映射为另一种形式

  • sorted():排序元素

  • distinct():去重

java">List<String> result = list.stream().filter(s -> s.startsWith("a")).map(String::toUpperCase).collect(Collectors.toList());

终端操作

终端操作是Stream的最终处理步骤,常见的终端操作包括:

  • forEach(Consumer):对每个元素执行操作

  • collect(Collector):将Stream转换为集合

  • reduce(BinaryOperator):将Stream中的元素归约为一个值

  • count():计算Stream中的元素数量

java">long count = list.stream().filter(s -> s.startsWith("a")).count();

Stream API的高级用法

并行流

通过parallelStream()方法,可以轻松地将顺序流转换为并行流,从而利用多核处理器的优势。

java">List<String> result = list.parallelStream().filter(s -> s.startsWith("a")).collect(Collectors.toList());

自定义收集器

Java 8提供了Collectors类来支持常见的收集操作,但你也可以自定义收集器来实现更复杂的数据处理。

java">Collector<String, ?, TreeSet<String>> intoSet = Collector.of(TreeSet::new, TreeSet::add, (left, right) -> { left.addAll(right); return left; });TreeSet<String> set = list.stream().collect(intoSet);

流的拼接与拆分

Stream API还支持流的拼接与拆分操作,如flatMap()可以将多个流合并为一个流,limit()和skip()可以用于流的拆分。

java">List<List<String>> lists = Arrays.asList(Arrays.asList("a", "b"),Arrays.asList("c", "d")
);List<String> flatList = lists.stream().flatMap(List::stream).collect(Collectors.toList());

Stream API的实战应用

数据处理与转换

Stream API非常适合用于数据处理与转换场景,如从数据库中读取数据并进行过滤、映射等操作。

java">List<User> users = userRepository.findAll();
List<String> names = users.stream().filter(user -> user.getAge() > 18).map(User::getName).collect(Collectors.toList());

数据统计与聚合

Stream API可以方便地进行数据统计与聚合操作,如计算平均值、最大值、最小值等。

java">Double averageAge = users.stream().mapToInt(User::getAge).average().orElse(0);

并行处理大数据集

对于大数据集,使用并行流可以显著提高处理速度。例如,处理一个包含百万条记录的数据集时,并行流可以充分利用多核CPU的优势。

java">List<User> users = userRepository.findAll();
List<String> names = users.parallelStream().filter(user -> user.getAge() > 18).map(User::getName).collect(Collectors.toList());


http://www.ppmy.cn/embedded/160482.html

相关文章

deepseek API 调用-golang

【1】golang使用POST提交请求 package mainimport ("fmt""strings""net/http""io/ioutil" )func main() {url : "https://api.deepseek.com/chat/completions"method : "POST"payload : strings.NewReader({&quo…

用 Java 轻松读取 Word 文档内容

嘿&#xff0c;朋友们&#xff01;在 Java 开发里&#xff0c;有时候咱得读取 Word 文档里的内容&#xff0c;这在处理合同、报告等文件时特别有用。咱可以根据 Word 文档的格式&#xff0c;用不同的库来实现读取功能。下面就详细说说 .doc 和 .docx 这两种常见格式文档的读取方…

Kafka 入门与实战

一、Kafka 基础 1.1 创建topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test --create 1.2 查看消费者偏移量位置 kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group test 1.3 消息的生产与发送 #生产者 kafka-cons…

Redis基础篇(万丈高楼平地起):核心底层数据结构

大家好&#xff0c;我是小龙。近期有很多小伙伴私信我Redis怎么做持久化&#xff1f;集群方案怎么做&#xff1f;分布式锁怎么实现&#xff1f;可是我发现&#xff0c;每次简答完一个问题他还有其他类似问题&#xff0c;或则各个知识点不能串通形成体系&#xff0c;导致很多问题…

RocketMQ实战—6.生产优化及运维方案

大纲 1.RocketMQ集群如何进行权限机制的控制 2.如何对RocketMQ集群进行消息堆积的追踪 3.如何处理RocketMQ的百万消息积压问题 4.针对RocketMQ集群崩溃的金融级高可用方案 5.为RocketMQ增加消息限流功能保证其高可用 6.从Kafka迁移到RocketMQ的双写双读方案 1.RocketMQ集…

easyxor

easyxor 一、查壳 无壳&#xff0c;64位 二、IDA分析 1.main 2.查看key与r(shifee提取) 三、脚本 r [0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, …

04树 + 堆 + 优先队列 + 图(D1_树(D10_决策树))

目录 一、引言 二、算法原理 三、算法实现 四、知识小结 一、引言 决策树算法是一种常用的机器学习算法&#xff0c;可用于分类和回归问题。它基于特征之间的条件判断来构 建一棵树&#xff0c;树的每个节点代表一个特征&#xff0c;每个叶节点代表一个类别或回归值。决策…

处理器架构 :如何高效学习 - 从理论到实践

处理器架构&#xff08;Processor Architecture&#xff09;是计算机系统的核心&#xff0c;决定了指令的执行方式、数据的存储组织以及并行处理能力。对于新手而言&#xff0c;理解处理器架构不仅需要理论学习&#xff0c;还需要结合实例和实践操作来掌握其运行流程。本文将介…