[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-java-streamxiandaijihechulideyouyazhidao":3},{"id":4,"title":5,"slug":6,"summary":7,"content":8,"contentHtml":9,"wordCount":10,"readingTime":11,"categoryId":12,"tags":13,"coverImage":13,"thumbnail":13,"status":14,"isTop":15,"isRecommended":15,"allowComments":15,"password":13,"viewCount":16,"likeCount":15,"commentCount":15,"seoTitle":5,"seoKeywords":17,"seoDescription":18,"source":13,"sourceUrl":13,"publishTime":19},"2002404939190562817","Java Stream：现代集合处理的优雅之道","java-streamxiandaijihechulideyouyazhidao","## 引言：从命令式到声明式的转变 在Java 8之前，集合处理通常采用传统的for循环或迭代器模式，代码冗长且意图不够清晰。Java 8引入的Stream API彻底改变了这一现状，让我们能够以声明式、函数式的方式处理数据集合。本文将带你深入探索Stream的强大功能，并通过实际代码示例展示其优雅之处。 ## 什么是Stream？ Stream（流）是Java 8中处理集合（Collection）数据的高级抽象。它不是一个数据结构，而是一个来自数据源（集合、数组等）的元素队列，支持聚合操作和并行处理。 **核心特点**： - 不存储数据：流本身不存储元素，只是传递元素 - 函数式操作：支持lambda表达式，代码更简洁 - 延迟执行：中间操作延迟执行，终端操作触发实际计算 - 可并行化：轻松实现并行处理 ## Stream操作分类 ### 1.","## 引言：从命令式到声明式的转变\n\n在Java 8之前，集合处理通常采用传统的for循环或迭代器模式，代码冗长且意图不够清晰。Java 8引入的Stream API彻底改变了这一现状，让我们能够以声明式、函数式的方式处理数据集合。本文将带你深入探索Stream的强大功能，并通过实际代码示例展示其优雅之处。\n\n## 什么是Stream？\n\nStream（流）是Java 8中处理集合（Collection）数据的高级抽象。它不是一个数据结构，而是一个来自数据源（集合、数组等）的元素队列，支持聚合操作和并行处理。\n\n**核心特点**：\n- 不存储数据：流本身不存储元素，只是传递元素\n- 函数式操作：支持lambda表达式，代码更简洁\n- 延迟执行：中间操作延迟执行，终端操作触发实际计算\n- 可并行化：轻松实现并行处理\n\n## Stream操作分类\n\n### 1. 中间操作（Intermediate Operations）\n返回新的Stream，可链式调用\n- `filter()`：过滤\n- `map()`：映射转换\n- `sorted()`：排序\n- `distinct()`：去重\n- `limit()`：限制数量\n\n### 2. 终端操作（Terminal Operations）\n产生结果或副作用，触发流水线执行\n- `forEach()`：遍历\n- `collect()`：收集结果\n- `reduce()`：归约\n- `count()`：计数\n- `findFirst()`：查找第一个\n\n## 代码实例：传统 vs Stream\n\n### 示例1：过滤和收集\n\n**传统方式**：\n```java\n\u002F\u002F 传统方式：过滤年龄大于18的人并收集名字\nList\u003CPerson> people = getPeople();\nList\u003CString> adultNames = new ArrayList\u003C>();\n\nfor (Person person : people) {\n    if (person.getAge() > 18) {\n        adultNames.add(person.getName());\n    }\n}\n```\n\n**Stream方式**：\n```java\n\u002F\u002F Stream方式：更简洁、声明式\nList\u003CString> adultNames = people.stream()\n    .filter(person -> person.getAge() > 18)\n    .map(Person::getName)\n    .collect(Collectors.toList());\n```\n\n### 示例2：统计计算\n\n**传统方式**：\n```java\n\u002F\u002F 计算整数列表中大于10的数的平均值\nList\u003CInteger> numbers = Arrays.asList(5, 12, 8, 20, 15, 3);\nint sum = 0;\nint count = 0;\n\nfor (Integer num : numbers) {\n    if (num > 10) {\n        sum += num;\n        count++;\n    }\n}\ndouble average = count > 0 ? (double) sum \u002F count : 0;\n```\n\n**Stream方式**：\n```java\nOptionalDouble average = numbers.stream()\n    .filter(num -> num > 10)\n    .mapToInt(Integer::intValue)\n    .average();\n```\n\n### 示例3：复杂数据转换\n\n```java\n\u002F\u002F 将人员按城市分组，并计算每个城市的平均年龄\nMap\u003CString, Double> cityAverageAge = people.stream()\n    .collect(Collectors.groupingBy(\n        Person::getCity,\n        Collectors.averagingInt(Person::getAge)\n    ));\n\n\u002F\u002F 查找年龄最大的3个人\nList\u003CPerson> oldestThree = people.stream()\n    .sorted((p1, p2) -> p2.getAge() - p1.getAge())\n    .limit(3)\n    .collect(Collectors.toList());\n```\n\n## 性能深度对比\n\n### 测试环境\n- JDK 17\n- 测试数据：1000万条整数记录\n- 测试机器：8核CPU，16GB内存\n\n### 测试1：简单过滤和映射\n\n```java\n\u002F\u002F 性能测试代码\npublic class PerformanceTest {\n    public static void main(String[] args) {\n        List\u003CInteger> numbers = IntStream.rangeClosed(1, 10_000_000)\n            .boxed()\n            .collect(Collectors.toList());\n        \n        \u002F\u002F 传统方式\n        long startTime = System.currentTimeMillis();\n        List\u003CInteger> traditionalResult = new ArrayList\u003C>();\n        for (Integer num : numbers) {\n            if (num % 2 == 0) {\n                traditionalResult.add(num * 2);\n            }\n        }\n        long traditionalTime = System.currentTimeMillis() - startTime;\n        \n        \u002F\u002F Stream方式（顺序流）\n        startTime = System.currentTimeMillis();\n        List\u003CInteger> streamResult = numbers.stream()\n            .filter(num -> num % 2 == 0)\n            .map(num -> num * 2)\n            .collect(Collectors.toList());\n        long streamTime = System.currentTimeMillis() - startTime;\n        \n        \u002F\u002F 并行流方式\n        startTime = System.currentTimeMillis();\n        List\u003CInteger> parallelResult = numbers.parallelStream()\n            .filter(num -> num % 2 == 0)\n            .map(num -> num * 2)\n            .collect(Collectors.toList());\n        long parallelTime = System.currentTimeMillis() - startTime;\n        \n        System.out.println(\"传统方式: \" + traditionalTime + \"ms\");\n        System.out.println(\"Stream方式: \" + streamTime + \"ms\");\n        System.out.println(\"并行Stream: \" + parallelTime + \"ms\");\n    }\n}\n```\n\n**测试结果**：\n```\n传统方式: 245ms\nStream方式: 312ms\n并行Stream: 78ms\n```\n\n### 测试2：复杂聚合操作\n\n```java\n\u002F\u002F 分组和聚合性能对比\npublic class GroupByPerformance {\n    public static void main(String[] args) {\n        List\u003CPerson> people = generatePeople(1_000_000);\n        \n        \u002F\u002F 传统分组\n        long start = System.currentTimeMillis();\n        Map\u003CString, List\u003CPerson>> traditionalGroups = new HashMap\u003C>();\n        for (Person p : people) {\n            traditionalGroups\n                .computeIfAbsent(p.getCity(), k -> new ArrayList\u003C>())\n                .add(p);\n        }\n        System.out.println(\"传统分组: \" + (System.currentTimeMillis() - start) + \"ms\");\n        \n        \u002F\u002F Stream分组\n        start = System.currentTimeMillis();\n        Map\u003CString, List\u003CPerson>> streamGroups = people.stream()\n            .collect(Collectors.groupingBy(Person::getCity));\n        System.out.println(\"Stream分组: \" + (System.currentTimeMillis() - start) + \"ms\");\n        \n        \u002F\u002F 并行Stream分组\n        start = System.currentTimeMillis();\n        Map\u003CString, List\u003CPerson>> parallelGroups = people.parallelStream()\n            .collect(Collectors.groupingBy(Person::getCity));\n        System.out.println(\"并行Stream分组: \" + (System.currentTimeMillis() - start) + \"ms\");\n    }\n}\n```\n\n## 性能分析：何时使用哪种方式？\n\n### Stream的优势场景：\n1. **数据处理流水线**：多个连续操作时，Stream的流水线更优雅\n2. **并行处理**：大数据量时，`parallelStream()`可显著提升性能\n3. **复杂聚合**：分组、分区、统计等操作\n4. **代码可读性**：声明式编程，意图更清晰\n\n### 传统循环的优势场景：\n1. **简单操作**：少量、简单的遍历操作\n2. **性能关键**：极小数据量时，传统循环可能略快\n3. **需要控制流程**：需要break、continue等控制语句时\n4. **副作用操作**：需要修改外部变量时\n\n### 性能优化建议：\n\n```java\n\u002F\u002F 1. 使用基本类型流避免装箱开销\nIntStream.range(0, 1000)  \u002F\u002F 比Stream\u003CInteger>更高效\n    .sum();\n\n\u002F\u002F 2. 并行流使用注意事项\nList\u003CInteger> result = largeList.parallelStream()\n    .filter(this::expensiveFilter)  \u002F\u002F 确保过滤操作足够\"重\"\n    .map(this::expensiveMap)        \u002F\u002F 确保映射操作足够\"重\"\n    .collect(Collectors.toList());\n\n\u002F\u002F 3. 避免在流中执行耗时操作\n\u002F\u002F 错误示例 - 每次循环都创建新对象\nitems.stream()\n    .map(item -> {\n        ExpensiveObject obj = new ExpensiveObject(); \u002F\u002F 避免！\n        return obj.process(item);\n    });\n\n\u002F\u002F 4. 使用短路操作优化\nOptional\u003CPerson> result = people.stream()\n    .filter(p -> p.getAge() > 18)\n    .filter(p -> p.getCity().equals(\"Beijing\"))\n    .findFirst();  \u002F\u002F 找到第一个就停止\n```\n\n## Stream高级特性\n\n### 1. 自定义收集器\n```java\n\u002F\u002F 创建高效的字符串连接收集器\nString concatenated = items.stream()\n    .collect(Collector.of(\n        StringBuilder::new,           \u002F\u002F 供应器\n        StringBuilder::append,        \u002F\u002F 累加器\n        StringBuilder::append,        \u002F\u002F 组合器（用于并行）\n        StringBuilder::toString       \u002F\u002F 完成器\n    ));\n```\n\n### 2. 无限流\n```java\n\u002F\u002F 生成斐波那契数列\nStream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0] + t[1]})\n    .limit(10)\n    .map(t -> t[0])\n    .forEach(System.out::println);\n```\n\n### 3. 流的分区和分组\n```java\n\u002F\u002F 分区：按条件分为两部分\nMap\u003CBoolean, List\u003CPerson>> partitioned = people.stream()\n    .collect(Collectors.partitioningBy(p -> p.getAge() >= 18));\n\n\u002F\u002F 多级分组\nMap\u003CString, Map\u003CString, List\u003CPerson>>> multiGroup = people.stream()\n    .collect(Collectors.groupingBy(\n        Person::getCountry,\n        Collectors.groupingBy(Person::getCity)\n    ));\n```\n\n## 最佳实践总结\n\n1. **保持流操作纯函数化**：避免在lambda中修改外部状态\n2. **优先使用方法引用**：提高代码可读性\n   ```java\n   \u002F\u002F 使用方法引用\n   .map(Person::getName)\n   \n   \u002F\u002F 而不是\n   .map(person -> person.getName())\n   ```\n\n3. **注意流的重用**：流是一次性的，不能重复使用\n4. **合理使用并行流**：\n   - 数据量足够大（通常>10000）\n   - 操作足够耗时\n   - 数据源易于分割（如ArrayList比LinkedList更适合）\n\n5. **调试技巧**：\n```java\n\u002F\u002F 使用peek进行调试\nlist.stream()\n    .peek(e -> System.out.println(\"过滤前: \" + e))\n    .filter(e -> e > 10)\n    .peek(e -> System.out.println(\"过滤后: \" + e))\n    .collect(Collectors.toList());\n```\n\n## 结论\n\nJava Stream API代表了集合处理方式的革命性进步。它不仅使代码更加简洁、可读，而且通过声明式编程让开发者的意图更加清晰。虽然在某些简单场景下传统循环可能有微弱的性能优势，但Stream在可维护性、可读性和并行处理能力方面具有明显优势。\n\n**选择建议**：\n- 对于复杂的数据处理流水线，优先使用Stream\n- 对于简单遍历，根据团队习惯选择\n- 对于大数据量计算，考虑使用并行Stream\n- 始终在可读性和性能之间找到平衡点\n\nStream不仅是语法糖，更是思维方式的转变——从\"如何做\"到\"做什么\"的转变。掌握Stream，你将写出更符合现代Java编程风格的优雅代码。\n\n---\n\n*注：本文所有性能测试结果基于特定环境，实际结果可能因JVM版本、硬件配置和数据特性而有所不同，建议在实际项目中根据具体场景进行性能测试。*","\u003Ch2 data-line=\"0\" id=\"引言：从命令式到声明式的转变\">引言：从命令式到声明式的转变\u003C\u002Fh2>\n\u003Cp data-line=\"2\">在Java 8之前，集合处理通常采用传统的for循环或迭代器模式，代码冗长且意图不够清晰。Java 8引入的Stream API彻底改变了这一现状，让我们能够以声明式、函数式的方式处理数据集合。本文将带你深入探索Stream的强大功能，并通过实际代码示例展示其优雅之处。\u003C\u002Fp>\n\u003Ch2 data-line=\"4\" id=\"什么是Stream？\">什么是Stream？\u003C\u002Fh2>\n\u003Cp data-line=\"6\">Stream（流）是Java 8中处理集合（Collection）数据的高级抽象。它不是一个数据结构，而是一个来自数据源（集合、数组等）的元素队列，支持聚合操作和并行处理。\u003C\u002Fp>\n\u003Cp data-line=\"8\">\u003Cstrong>核心特点\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul data-line=\"9\">\n\u003Cli data-line=\"9\">不存储数据：流本身不存储元素，只是传递元素\u003C\u002Fli>\n\u003Cli data-line=\"10\">函数式操作：支持lambda表达式，代码更简洁\u003C\u002Fli>\n\u003Cli data-line=\"11\">延迟执行：中间操作延迟执行，终端操作触发实际计算\u003C\u002Fli>\n\u003Cli data-line=\"12\">可并行化：轻松实现并行处理\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 data-line=\"14\" id=\"Stream操作分类\">Stream操作分类\u003C\u002Fh2>\n\u003Ch3 data-line=\"16\" id=\"1. 中间操作（Intermediate Operations）\">1. 中间操作（Intermediate Operations）\u003C\u002Fh3>\n\u003Cp data-line=\"17\">返回新的Stream，可链式调用\u003C\u002Fp>\n\u003Cul data-line=\"18\">\n\u003Cli data-line=\"18\">\u003Ccode>filter()\u003C\u002Fcode>：过滤\u003C\u002Fli>\n\u003Cli data-line=\"19\">\u003Ccode>map()\u003C\u002Fcode>：映射转换\u003C\u002Fli>\n\u003Cli data-line=\"20\">\u003Ccode>sorted()\u003C\u002Fcode>：排序\u003C\u002Fli>\n\u003Cli data-line=\"21\">\u003Ccode>distinct()\u003C\u002Fcode>：去重\u003C\u002Fli>\n\u003Cli data-line=\"22\">\u003Ccode>limit()\u003C\u002Fcode>：限制数量\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 data-line=\"24\" id=\"2. 终端操作（Terminal Operations）\">2. 终端操作（Terminal Operations）\u003C\u002Fh3>\n\u003Cp data-line=\"25\">产生结果或副作用，触发流水线执行\u003C\u002Fp>\n\u003Cul data-line=\"26\">\n\u003Cli data-line=\"26\">\u003Ccode>forEach()\u003C\u002Fcode>：遍历\u003C\u002Fli>\n\u003Cli data-line=\"27\">\u003Ccode>collect()\u003C\u002Fcode>：收集结果\u003C\u002Fli>\n\u003Cli data-line=\"28\">\u003Ccode>reduce()\u003C\u002Fcode>：归约\u003C\u002Fli>\n\u003Cli data-line=\"29\">\u003Ccode>count()\u003C\u002Fcode>：计数\u003C\u002Fli>\n\u003Cli data-line=\"30\">\u003Ccode>findFirst()\u003C\u002Fcode>：查找第一个\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 data-line=\"32\" id=\"代码实例：传统 vs Stream\">代码实例：传统 vs Stream\u003C\u002Fh2>\n\u003Ch3 data-line=\"34\" id=\"示例1：过滤和收集\">示例1：过滤和收集\u003C\u002Fh3>\n\u003Cp data-line=\"36\">\u003Cstrong>传统方式\u003C\u002Fstrong>：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"37\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 传统方式：过滤年龄大于18的人并收集名字\u003C\u002Fspan>\nList&lt;Person&gt; people = getPeople();\nList&lt;String&gt; adultNames = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;();\n\n\u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> (Person person : people) {\n    \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (person.getAge() &gt; \u003Cspan class=\"hljs-number\">18\u003C\u002Fspan>) {\n        adultNames.add(person.getName());\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"49\">\u003Cstrong>Stream方式\u003C\u002Fstrong>：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"50\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F Stream方式：更简洁、声明式\u003C\u002Fspan>\nList&lt;String&gt; adultNames = people.stream()\n    .filter(person -&gt; person.getAge() &gt; \u003Cspan class=\"hljs-number\">18\u003C\u002Fspan>)\n    .map(Person::getName)\n    .collect(Collectors.toList());\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"58\" id=\"示例2：统计计算\">示例2：统计计算\u003C\u002Fh3>\n\u003Cp data-line=\"60\">\u003Cstrong>传统方式\u003C\u002Fstrong>：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"61\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 计算整数列表中大于10的数的平均值\u003C\u002Fspan>\nList&lt;Integer&gt; numbers = Arrays.asList(\u003Cspan class=\"hljs-number\">5\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">12\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">8\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">20\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">15\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>);\n\u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">sum\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\n\u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">count\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\n\n\u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> (Integer num : numbers) {\n    \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (num &gt; \u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>) {\n        sum += num;\n        count++;\n    }\n}\n\u003Cspan class=\"hljs-type\">double\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">average\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> count &gt; \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan> ? (\u003Cspan class=\"hljs-type\">double\u003C\u002Fspan>) sum \u002F count : \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"76\">\u003Cstrong>Stream方式\u003C\u002Fstrong>：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"77\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-type\">OptionalDouble\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">average\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> numbers.stream()\n    .filter(num -&gt; num &gt; \u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>)\n    .mapToInt(Integer::intValue)\n    .average();\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"84\" id=\"示例3：复杂数据转换\">示例3：复杂数据转换\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"86\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 将人员按城市分组，并计算每个城市的平均年龄\u003C\u002Fspan>\nMap&lt;String, Double&gt; cityAverageAge = people.stream()\n    .collect(Collectors.groupingBy(\n        Person::getCity,\n        Collectors.averagingInt(Person::getAge)\n    ));\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 查找年龄最大的3个人\u003C\u002Fspan>\nList&lt;Person&gt; oldestThree = people.stream()\n    .sorted((p1, p2) -&gt; p2.getAge() - p1.getAge())\n    .limit(\u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>)\n    .collect(Collectors.toList());\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"101\" id=\"性能深度对比\">性能深度对比\u003C\u002Fh2>\n\u003Ch3 data-line=\"103\" id=\"测试环境\">测试环境\u003C\u002Fh3>\n\u003Cul data-line=\"104\">\n\u003Cli data-line=\"104\">JDK 17\u003C\u002Fli>\n\u003Cli data-line=\"105\">测试数据：1000万条整数记录\u003C\u002Fli>\n\u003Cli data-line=\"106\">测试机器：8核CPU，16GB内存\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 data-line=\"108\" id=\"测试1：简单过滤和映射\">测试1：简单过滤和映射\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"110\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 性能测试代码\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">PerformanceTest\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;Integer&gt; numbers = IntStream.rangeClosed(\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">10_000_000\u003C\u002Fspan>)\n            .boxed()\n            .collect(Collectors.toList());\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 传统方式\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">startTime\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> System.currentTimeMillis();\n        List&lt;Integer&gt; traditionalResult = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;();\n        \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> (Integer num : numbers) {\n            \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (num % \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan> == \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>) {\n                traditionalResult.add(num * \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>);\n            }\n        }\n        \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">traditionalTime\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> System.currentTimeMillis() - startTime;\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F Stream方式（顺序流）\u003C\u002Fspan>\n        startTime = System.currentTimeMillis();\n        List&lt;Integer&gt; streamResult = numbers.stream()\n            .filter(num -&gt; num % \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan> == \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>)\n            .map(num -&gt; num * \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>)\n            .collect(Collectors.toList());\n        \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">streamTime\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> System.currentTimeMillis() - startTime;\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 并行流方式\u003C\u002Fspan>\n        startTime = System.currentTimeMillis();\n        List&lt;Integer&gt; parallelResult = numbers.parallelStream()\n            .filter(num -&gt; num % \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan> == \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>)\n            .map(num -&gt; num * \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>)\n            .collect(Collectors.toList());\n        \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">parallelTime\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> System.currentTimeMillis() - startTime;\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;传统方式: &quot;\u003C\u002Fspan> + traditionalTime + \u003Cspan class=\"hljs-string\">&quot;ms&quot;\u003C\u002Fspan>);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;Stream方式: &quot;\u003C\u002Fspan> + streamTime + \u003Cspan class=\"hljs-string\">&quot;ms&quot;\u003C\u002Fspan>);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;并行Stream: &quot;\u003C\u002Fspan> + parallelTime + \u003Cspan class=\"hljs-string\">&quot;ms&quot;\u003C\u002Fspan>);\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"151\">\u003Cstrong>测试结果\u003C\u002Fstrong>：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"152\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-\" language=>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-section\">传统方式: 245ms\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">Stream方式: 312ms\u003C\u002Fspan>\n\u003Cspan class=\"hljs-section\">并行Stream: 78ms\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"158\" id=\"测试2：复杂聚合操作\">测试2：复杂聚合操作\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"160\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 分组和聚合性能对比\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">GroupByPerformance\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;Person&gt; people = generatePeople(\u003Cspan class=\"hljs-number\">1_000_000\u003C\u002Fspan>);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 传统分组\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">start\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> System.currentTimeMillis();\n        Map&lt;String, List&lt;Person&gt;&gt; traditionalGroups = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">HashMap\u003C\u002Fspan>&lt;&gt;();\n        \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> (Person p : people) {\n            traditionalGroups\n                .computeIfAbsent(p.getCity(), k -&gt; \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;())\n                .add(p);\n        }\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;传统分组: &quot;\u003C\u002Fspan> + (System.currentTimeMillis() - start) + \u003Cspan class=\"hljs-string\">&quot;ms&quot;\u003C\u002Fspan>);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F Stream分组\u003C\u002Fspan>\n        start = System.currentTimeMillis();\n        Map&lt;String, List&lt;Person&gt;&gt; streamGroups = people.stream()\n            .collect(Collectors.groupingBy(Person::getCity));\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;Stream分组: &quot;\u003C\u002Fspan> + (System.currentTimeMillis() - start) + \u003Cspan class=\"hljs-string\">&quot;ms&quot;\u003C\u002Fspan>);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 并行Stream分组\u003C\u002Fspan>\n        start = System.currentTimeMillis();\n        Map&lt;String, List&lt;Person&gt;&gt; parallelGroups = people.parallelStream()\n            .collect(Collectors.groupingBy(Person::getCity));\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;并行Stream分组: &quot;\u003C\u002Fspan> + (System.currentTimeMillis() - start) + \u003Cspan class=\"hljs-string\">&quot;ms&quot;\u003C\u002Fspan>);\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"191\" id=\"性能分析：何时使用哪种方式？\">性能分析：何时使用哪种方式？\u003C\u002Fh2>\n\u003Ch3 data-line=\"193\" id=\"Stream的优势场景：\">Stream的优势场景：\u003C\u002Fh3>\n\u003Col data-line=\"194\">\n\u003Cli data-line=\"194\">\u003Cstrong>数据处理流水线\u003C\u002Fstrong>：多个连续操作时，Stream的流水线更优雅\u003C\u002Fli>\n\u003Cli data-line=\"195\">\u003Cstrong>并行处理\u003C\u002Fstrong>：大数据量时，\u003Ccode>parallelStream()\u003C\u002Fcode>可显著提升性能\u003C\u002Fli>\n\u003Cli data-line=\"196\">\u003Cstrong>复杂聚合\u003C\u002Fstrong>：分组、分区、统计等操作\u003C\u002Fli>\n\u003Cli data-line=\"197\">\u003Cstrong>代码可读性\u003C\u002Fstrong>：声明式编程，意图更清晰\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 data-line=\"199\" id=\"传统循环的优势场景：\">传统循环的优势场景：\u003C\u002Fh3>\n\u003Col data-line=\"200\">\n\u003Cli data-line=\"200\">\u003Cstrong>简单操作\u003C\u002Fstrong>：少量、简单的遍历操作\u003C\u002Fli>\n\u003Cli data-line=\"201\">\u003Cstrong>性能关键\u003C\u002Fstrong>：极小数据量时，传统循环可能略快\u003C\u002Fli>\n\u003Cli data-line=\"202\">\u003Cstrong>需要控制流程\u003C\u002Fstrong>：需要break、continue等控制语句时\u003C\u002Fli>\n\u003Cli data-line=\"203\">\u003Cstrong>副作用操作\u003C\u002Fstrong>：需要修改外部变量时\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 data-line=\"205\" id=\"性能优化建议：\">性能优化建议：\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"207\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 1. 使用基本类型流避免装箱开销\u003C\u002Fspan>\nIntStream.range(\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">1000\u003C\u002Fspan>)  \u003Cspan class=\"hljs-comment\">\u002F\u002F 比Stream&lt;Integer&gt;更高效\u003C\u002Fspan>\n    .sum();\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 2. 并行流使用注意事项\u003C\u002Fspan>\nList&lt;Integer&gt; result = largeList.parallelStream()\n    .filter(\u003Cspan class=\"hljs-built_in\">this\u003C\u002Fspan>::expensiveFilter)  \u003Cspan class=\"hljs-comment\">\u002F\u002F 确保过滤操作足够&quot;重&quot;\u003C\u002Fspan>\n    .map(\u003Cspan class=\"hljs-built_in\">this\u003C\u002Fspan>::expensiveMap)        \u003Cspan class=\"hljs-comment\">\u002F\u002F 确保映射操作足够&quot;重&quot;\u003C\u002Fspan>\n    .collect(Collectors.toList());\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 3. 避免在流中执行耗时操作\u003C\u002Fspan>\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 错误示例 - 每次循环都创建新对象\u003C\u002Fspan>\nitems.stream()\n    .map(item -&gt; {\n        \u003Cspan class=\"hljs-type\">ExpensiveObject\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">obj\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ExpensiveObject\u003C\u002Fspan>(); \u003Cspan class=\"hljs-comment\">\u002F\u002F 避免！\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> obj.process(item);\n    });\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 4. 使用短路操作优化\u003C\u002Fspan>\nOptional&lt;Person&gt; result = people.stream()\n    .filter(p -&gt; p.getAge() &gt; \u003Cspan class=\"hljs-number\">18\u003C\u002Fspan>)\n    .filter(p -&gt; p.getCity().equals(\u003Cspan class=\"hljs-string\">&quot;Beijing&quot;\u003C\u002Fspan>))\n    .findFirst();  \u003Cspan class=\"hljs-comment\">\u002F\u002F 找到第一个就停止\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"233\" id=\"Stream高级特性\">Stream高级特性\u003C\u002Fh2>\n\u003Ch3 data-line=\"235\" id=\"1. 自定义收集器\">1. 自定义收集器\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"236\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 创建高效的字符串连接收集器\u003C\u002Fspan>\n\u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">concatenated\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> items.stream()\n    .collect(Collector.of(\n        StringBuilder::\u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan>,           \u003Cspan class=\"hljs-comment\">\u002F\u002F 供应器\u003C\u002Fspan>\n        StringBuilder::append,        \u003Cspan class=\"hljs-comment\">\u002F\u002F 累加器\u003C\u002Fspan>\n        StringBuilder::append,        \u003Cspan class=\"hljs-comment\">\u002F\u002F 组合器（用于并行）\u003C\u002Fspan>\n        StringBuilder::toString       \u003Cspan class=\"hljs-comment\">\u002F\u002F 完成器\u003C\u002Fspan>\n    ));\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"247\" id=\"2. 无限流\">2. 无限流\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"248\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 生成斐波那契数列\u003C\u002Fspan>\nStream.iterate(\u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">int\u003C\u002Fspan>[]{\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>}, t -&gt; \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">int\u003C\u002Fspan>[]{t[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>], t[\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>] + t[\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>]})\n    .limit(\u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>)\n    .map(t -&gt; t[\u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>])\n    .forEach(System.out::println);\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"256\" id=\"3. 流的分区和分组\">3. 流的分区和分组\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"257\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 分区：按条件分为两部分\u003C\u002Fspan>\nMap&lt;Boolean, List&lt;Person&gt;&gt; partitioned = people.stream()\n    .collect(Collectors.partitioningBy(p -&gt; p.getAge() &gt;= \u003Cspan class=\"hljs-number\">18\u003C\u002Fspan>));\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 多级分组\u003C\u002Fspan>\nMap&lt;String, Map&lt;String, List&lt;Person&gt;&gt;&gt; multiGroup = people.stream()\n    .collect(Collectors.groupingBy(\n        Person::getCountry,\n        Collectors.groupingBy(Person::getCity)\n    ));\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"270\" id=\"最佳实践总结\">最佳实践总结\u003C\u002Fh2>\n\u003Col data-line=\"272\">\n\u003Cli data-line=\"272\">\n\u003Cp data-line=\"272\">\u003Cstrong>保持流操作纯函数化\u003C\u002Fstrong>：避免在lambda中修改外部状态\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"273\">\n\u003Cp data-line=\"273\">\u003Cstrong>优先使用方法引用\u003C\u002Fstrong>：提高代码可读性\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"274\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 使用方法引用\u003C\u002Fspan>\n.map(Person::getName)\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 而不是\u003C\u002Fspan>\n.map(person -&gt; person.getName())\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003C\u002Fli>\n\u003Cli data-line=\"282\">\n\u003Cp data-line=\"282\">\u003Cstrong>注意流的重用\u003C\u002Fstrong>：流是一次性的，不能重复使用\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"283\">\n\u003Cp data-line=\"283\">\u003Cstrong>合理使用并行流\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul data-line=\"284\">\n\u003Cli data-line=\"284\">数据量足够大（通常&gt;10000）\u003C\u002Fli>\n\u003Cli data-line=\"285\">操作足够耗时\u003C\u002Fli>\n\u003Cli data-line=\"286\">数据源易于分割（如ArrayList比LinkedList更适合）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli data-line=\"288\">\n\u003Cp data-line=\"288\">\u003Cstrong>调试技巧\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\n        \u003Cdetails  data-line=\"289\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 使用peek进行调试\u003C\u002Fspan>\nlist.stream()\n    .peek(e -&gt; System.out.println(\u003Cspan class=\"hljs-string\">&quot;过滤前: &quot;\u003C\u002Fspan> + e))\n    .filter(e -&gt; e &gt; \u003Cspan class=\"hljs-number\">10\u003C\u002Fspan>)\n    .peek(e -&gt; System.out.println(\u003Cspan class=\"hljs-string\">&quot;过滤后: &quot;\u003C\u002Fspan> + e))\n    .collect(Collectors.toList());\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"298\" id=\"结论\">结论\u003C\u002Fh2>\n\u003Cp data-line=\"300\">Java Stream API代表了集合处理方式的革命性进步。它不仅使代码更加简洁、可读，而且通过声明式编程让开发者的意图更加清晰。虽然在某些简单场景下传统循环可能有微弱的性能优势，但Stream在可维护性、可读性和并行处理能力方面具有明显优势。\u003C\u002Fp>\n\u003Cp data-line=\"302\">\u003Cstrong>选择建议\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul data-line=\"303\">\n\u003Cli data-line=\"303\">对于复杂的数据处理流水线，优先使用Stream\u003C\u002Fli>\n\u003Cli data-line=\"304\">对于简单遍历，根据团队习惯选择\u003C\u002Fli>\n\u003Cli data-line=\"305\">对于大数据量计算，考虑使用并行Stream\u003C\u002Fli>\n\u003Cli data-line=\"306\">始终在可读性和性能之间找到平衡点\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp data-line=\"308\">Stream不仅是语法糖，更是思维方式的转变——从&quot;如何做&quot;到&quot;做什么&quot;的转变。掌握Stream，你将写出更符合现代Java编程风格的优雅代码。\u003C\u002Fp>\n\u003Chr data-line=\"310\">\n\u003Cp data-line=\"312\">\u003Cem>注：本文所有性能测试结果基于特定环境，实际结果可能因JVM版本、硬件配置和数据特性而有所不同，建议在实际项目中根据具体场景进行性能测试。\u003C\u002Fem>\u003C\u002Fp>\n",7216,24,"0","",2,0,7,"Stream,代码,操作,流,并行","引言：从命令式到声明式的转变\n在Java 8之前，集合处理通常采用传统的for循环或迭代器模式，代码冗长且意图不够清晰。Java 8引入的Stream API彻底改变了这一现状，让我们能够以声明式、函数式的方式处理数据集合。本文将带你深入探索Stream的强大功能，并通过实际代码示例展示其优雅之处。\n什么是Stream？","2025-12-20 23:45:14"]