跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java Stream中间操作
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Java Stream中间操作 = '''Java Stream中间操作'''是Java 8引入的Stream API中的核心概念之一,用于对数据流进行一系列处理,最终生成一个新的流。中间操作是惰性(lazy)的,只有在遇到终端操作时才会执行。本文将详细介绍常见的中间操作及其使用方法。 == 介绍 == Java Stream中间操作允许开发者对数据流进行过滤、映射、排序等操作,而不会改变原始数据源。这些操作可以链式调用,形成数据处理流水线。中间操作不会立即执行,只有在遇到终端操作(如`collect`、`forEach`)时才会触发计算。 == 常见中间操作 == === filter() === `filter()`方法用于根据条件筛选流中的元素,保留符合条件的元素。 <syntaxhighlight lang="java"> List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David"); List<String> filteredNames = names.stream() .filter(name -> name.length() > 4) .collect(Collectors.toList()); System.out.println(filteredNames); // 输出: [Alice, Charlie, David] </syntaxhighlight> === map() === `map()`方法将流中的每个元素转换为另一个形式。 <syntaxhighlight lang="java"> List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<Integer> nameLengths = names.stream() .map(String::length) .collect(Collectors.toList()); System.out.println(nameLengths); // 输出: [5, 3, 7] </syntaxhighlight> === flatMap() === `flatMap()`用于将多个流合并为一个流,常用于处理嵌套集合。 <syntaxhighlight lang="java"> List<List<String>> nestedNames = Arrays.asList( Arrays.asList("Alice", "Bob"), Arrays.asList("Charlie", "David") ); List<String> allNames = nestedNames.stream() .flatMap(Collection::stream) .collect(Collectors.toList()); System.out.println(allNames); // 输出: [Alice, Bob, Charlie, David] </syntaxhighlight> === distinct() === `distinct()`方法去除流中的重复元素。 <syntaxhighlight lang="java"> List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3); List<Integer> uniqueNumbers = numbers.stream() .distinct() .collect(Collectors.toList()); System.out.println(uniqueNumbers); // 输出: [1, 2, 3] </syntaxhighlight> === sorted() === `sorted()`方法对流中的元素进行排序。 <syntaxhighlight lang="java"> List<String> names = Arrays.asList("Charlie", "Alice", "Bob"); List<String> sortedNames = names.stream() .sorted() .collect(Collectors.toList()); System.out.println(sortedNames); // 输出: [Alice, Bob, Charlie] </syntaxhighlight> === peek() === `peek()`方法主要用于调试,允许查看流中的元素而不改变流。 <syntaxhighlight lang="java"> List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<String> result = names.stream() .peek(System.out::println) // 输出每个元素 .map(String::toUpperCase) .collect(Collectors.toList()); </syntaxhighlight> === limit()和skip() === `limit(n)`截取前n个元素,`skip(n)`跳过前n个元素。 <syntaxhighlight lang="java"> List<Integer> numbers = IntStream.range(1, 10) .boxed() .limit(5) .skip(2) .collect(Collectors.toList()); System.out.println(numbers); // 输出: [3, 4, 5] </syntaxhighlight> == 操作顺序的重要性 == 中间操作的顺序会影响性能和结果。例如,先`filter`再`map`通常比反过来更高效。 <mermaid> graph LR A[原始流] --> B[filter] B --> C[map] C --> D[终端操作] </mermaid> == 实际应用案例 == === 案例1:数据处理管道 === 处理用户数据,筛选活跃用户并计算其平均年龄: <syntaxhighlight lang="java"> List<User> users = getUsers(); // 假设返回用户列表 double averageAge = users.stream() .filter(User::isActive) .mapToInt(User::getAge) .average() .orElse(0.0); </syntaxhighlight> === 案例2:日志分析 === 分析日志文件,找出错误日志并提取关键信息: <syntaxhighlight lang="java"> List<String> errorMessages = Files.lines(Paths.get("app.log")) .filter(line -> line.contains("ERROR")) .map(line -> line.split(":")[2].trim()) .collect(Collectors.toList()); </syntaxhighlight> == 性能考虑 == * 中间操作是惰性的,不会立即执行 * 链式操作顺序影响性能 * 某些操作(如`sorted`)是有状态的,可能需要缓存整个流 == 数学基础 == Stream操作可以看作是一系列函数组合,数学上可以表示为: <math> f \circ g \circ h(x) = f(g(h(x))) </math> 其中每个中间操作对应一个函数。 == 总结 == Java Stream中间操作提供了强大的数据流处理能力,通过链式调用可以构建复杂的数据处理管道。理解各种中间操作的特性和适用场景,能够帮助开发者编写更高效、更简洁的代码。 [[Category:编程语言]] [[Category:Java]] [[Category:Java Stream API]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)