跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java Stream概述
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Java Stream概述 = Java Stream API是Java 8引入的一个强大的功能,用于以声明式的方式处理数据集合。它允许开发者以更简洁、更易读的方式编写数据处理代码,同时支持并行操作以提高性能。Stream API不是数据结构,而是对数据源(如集合、数组或I/O资源)的高层抽象,可以进行复杂的操作如过滤、映射、排序和聚合。 == 核心概念 == Stream API基于以下几个关键概念: * '''流(Stream)''':一个来自数据源的元素序列,支持聚合操作。 * '''中间操作(Intermediate Operations)''':返回新流的操作,如filter、map、sorted等,可以链式调用。 * '''终端操作(Terminal Operations)''':产生结果或副作用的操作,如forEach、collect、reduce等,会关闭流。 === 流的特点 === * '''不存储数据''':流本身不存储元素,而是从数据源(如集合)获取数据。 * '''函数式风格''':操作不会修改源数据,而是返回新的流。 * '''惰性求值''':中间操作不会立即执行,直到终端操作被调用。 * '''可消费性''':流只能被消费一次,终端操作后流即关闭。 == 创建流 == 可以通过多种方式创建流: <syntaxhighlight lang="java"> // 从集合创建 List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream1 = list.stream(); // 从数组创建 String[] array = {"a", "b", "c"}; Stream<String> stream2 = Arrays.stream(array); // 使用Stream.of Stream<String> stream3 = Stream.of("a", "b", "c"); // 生成无限流 Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2); </syntaxhighlight> == 常用操作示例 == === 过滤(filter) === <syntaxhighlight lang="java"> List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David"); List<String> result = names.stream() .filter(name -> name.length() > 4) .collect(Collectors.toList()); // 输出: [Alice, Charlie, David] </syntaxhighlight> === 映射(map) === <syntaxhighlight lang="java"> List<Integer> numbers = Arrays.asList(1, 2, 3, 4); List<Integer> squares = numbers.stream() .map(n -> n * n) .collect(Collectors.toList()); // 输出: [1, 4, 9, 16] </syntaxhighlight> === 排序(sorted) === <syntaxhighlight lang="java"> List<String> names = Arrays.asList("Charlie", "Alice", "Bob"); List<String> sortedNames = names.stream() .sorted() .collect(Collectors.toList()); // 输出: [Alice, Bob, Charlie] </syntaxhighlight> === 聚合(reduce) === <syntaxhighlight lang="java"> List<Integer> numbers = Arrays.asList(1, 2, 3, 4); int sum = numbers.stream() .reduce(0, (a, b) -> a + b); // 输出: 10 </syntaxhighlight> == 并行流 == Stream API支持并行处理,可以轻松利用多核处理器: <syntaxhighlight lang="java"> List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); int sum = numbers.parallelStream() .filter(n -> n % 2 == 0) .mapToInt(Integer::intValue) .sum(); // 输出: 30 </syntaxhighlight> == 实际应用案例 == === 案例1:数据处理 === 处理员工数据,筛选出薪资高于平均值的员工: <syntaxhighlight lang="java"> class Employee { String name; double salary; // 构造方法、getter/setter省略 } List<Employee> employees = Arrays.asList( new Employee("Alice", 50000), new Employee("Bob", 60000), new Employee("Charlie", 45000) ); double averageSalary = employees.stream() .mapToDouble(Employee::getSalary) .average() .orElse(0.0); List<Employee> aboveAverage = employees.stream() .filter(e -> e.getSalary() > averageSalary) .collect(Collectors.toList()); </syntaxhighlight> === 案例2:文件处理 === 读取文件并统计单词出现频率: <syntaxhighlight lang="java"> Path path = Paths.get("sample.txt"); Map<String, Long> wordCount = Files.lines(path) .flatMap(line -> Arrays.stream(line.split("\\s+"))) .collect(Collectors.groupingBy( String::toLowerCase, Collectors.counting() )); </syntaxhighlight> == 流操作流程图 == <mermaid> graph LR A[数据源] --> B[创建流] B --> C[中间操作] C --> D[终端操作] C -->|filter| C C -->|map| C C -->|sorted| C C -->|其他操作| C D --> E[结果/副作用] </mermaid> == 数学基础 == Stream API中的一些操作有数学基础,例如reduce操作类似于数学中的求和: <math> \sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n </math> 在Java中表示为: <syntaxhighlight lang="java"> numbers.stream().reduce(0, (a, b) -> a + b); </syntaxhighlight> == 性能考虑 == * 对于小数据集,顺序流可能更快 * 对于大数据集,并行流可以显著提高性能 * 注意中间操作的开销,如sorted可能导致性能下降 == 总结 == Java Stream API提供了一种高效、声明式的方式来处理数据集合。通过理解其核心概念和操作,开发者可以编写更简洁、更易维护的代码。Stream API特别适合数据处理、转换和聚合任务,是现代Java编程中不可或缺的工具。 [[Category:编程语言]] [[Category:Java]] [[Category:Java Stream API]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)