首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

知识点:Java 中的 Stream API

  • 25-04-23 13:41
  • 2148
  • 7055
juejin.cn

一、Stream API 简介

Java 8 引入的 Stream API 是对集合操作的一种全新方式,它为处理集合数据提供了简洁、高效且功能强大的方法。Stream 不是一种数据结构,而是在数据源(如集合、数组等)上进行功能性操作的管道。它允许我们以声明式的方式处理数据,将数据处理逻辑与数据本身分离开来,从而使代码更加易读和易于维护。

二、Stream 的创建

  1. 从集合创建 集合类(如 List、Set)提供了 stream() 和 parallelStream() 方法来创建顺序流和并行流。例如:
java
代码解读
复制代码
import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; public class StreamFromCollection { public static void main(String[] args) { List numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); numbers.add(3); // 创建顺序流 Stream sequentialStream = numbers.stream(); // 创建并行流 Stream parallelStream = numbers.parallelStream(); } }
  1. 从数组创建 通过 Arrays.stream() 方法可以从数组创建 Stream。例如:
java
代码解读
复制代码
import java.util.Arrays; import java.util.stream.Stream; public class StreamFromArray { public static void main(String[] args) { int[] array = {1, 2, 3, 4, 5}; Stream<int[]> streamFromArray = Stream.of(array); // 对于基本类型数组,也可以直接使用 Arrays.stream java.util.stream.IntStream intStream = Arrays.stream(array); } }
  1. 使用 Stream.of() 创建 可以使用 Stream.of() 方法创建包含特定元素的 Stream。例如:
java
代码解读
复制代码
import java.util.stream.Stream; public class StreamOfExample { public static void main(String[] args) { Stream stream = Stream.of("apple", "banana", "cherry"); } }

三、Stream 的操作

Stream 的操作分为中间操作和终端操作。

(一)中间操作

中间操作会返回一个新的 Stream,并且可以链式调用多个中间操作。常见的中间操作有:

  1. 过滤(filter) filter 方法用于根据给定的条件过滤 Stream 中的元素。例如:
java
代码解读
复制代码
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class FilterExample { public static void main(String[] args) { List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); List evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers); } }
  1. 映射(map) map 方法将 Stream 中的每个元素按照给定的函数进行转换。例如:
java
代码解读
复制代码
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class MapExample { public static void main(String[] args) { List numbers = Arrays.asList(1, 2, 3); List squaredNumbers = numbers.stream() .map(n -> n * n) .collect(Collectors.toList()); System.out.println(squaredNumbers); } }
  1. 排序(sorted) sorted 方法用于对 Stream 中的元素进行排序。例如:
java
代码解读
复制代码
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class SortedExample { public static void main(String[] args) { List numbers = Arrays.asList(3, 1, 2); List sortedNumbers = numbers.stream() .sorted() .collect(Collectors.toList()); System.out.println(sortedNumbers); } }

(二)终端操作

终端操作会触发 Stream 的处理,并返回一个结果或副作用。常见的终端操作有:

  1. 收集(collect) collect 方法用于将 Stream 中的元素收集到一个集合中,或者进行一些聚合操作。例如:
java
代码解读
复制代码
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class CollectExample { public static void main(String[] args) { List numbers = Arrays.asList(1, 2, 3); List squaredNumbers = numbers.stream() .map(n -> n * n) .collect(Collectors.toList()); // 收集到 Set Set squaredSet = numbers.stream() .map(n -> n * n) .collect(Collectors.toSet()); // 计算总和 int sum = numbers.stream() .mapToInt(Integer::intValue) .sum(); } }
  1. 遍历(forEach) forEach 方法用于对 Stream 中的每个元素执行给定的操作。例如:
java
代码解读
复制代码
import java.util.Arrays; import java.util.List; public class ForEachExample { public static void main(String[] args) { List numbers = Arrays.asList(1, 2, 3); numbers.stream() .forEach(System.out::println); } }
  1. 归约(reduce) reduce 方法将 Stream 中的元素组合起来,通过一个二元操作得到一个累积的结果。例如:
java
代码解读
复制代码
import java.util.Arrays; import java.util.List; public class ReduceExample { public static void main(String[] args) { List numbers = Arrays.asList(1, 2, 3); int sum = numbers.stream() .reduce(0, (a, b) -> a + b); System.out.println(sum); } }

四、并行流

并行流利用多核 CPU 的优势,将 Stream 中的元素分成多个部分,并行地对每个部分进行操作,从而提高处理效率。创建并行流很简单,只需要在集合上调用 parallelStream() 方法即可。例如:

java
代码解读
复制代码
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class ParallelStreamExample { public static void main(String[] args) { List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List squaredNumbers = numbers.parallelStream() .map(n -> n * n) .collect(Collectors.toList()); System.out.println(squaredNumbers); } }

但需要注意的是,并行流并不总是比顺序流快,特别是在数据量较小或者操作本身较为简单的情况下。此外,并行流在处理共享状态或者有副作用的操作时需要特别小心,因为并行操作可能会导致数据竞争和不一致的结果。

Stream API 为 Java 开发者提供了一种强大而灵活的方式来处理集合数据,使得代码更加简洁、高效。合理使用 Stream API 可以提高程序的可读性和性能。

注:本文转载自juejin.cn的木昜先生的文章"https://juejin.cn/post/7496021617350606900"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

103
后端
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top