Java 中的集合与流

10 Sept 2024 | 4 分钟阅读

Java 是一种功能强大的编程语言,它为开发人员提供了各种工具和构造来有效地管理和处理数据。用于处理数据的两个最广泛使用的机制是集合(Collections)和流(Streams)。两者都有独特的功能和各自的优点及用例。在本文中,我们将深入探讨 Java 中集合和流之间的区别,以表格形式进行详细比较,并附有说明性示例。

Java 集合

Java 中的集合是将其多个元素分组到一个单元中的对象。它提供了各种数据结构来存储、检索和操作元素。

集合的特点

  1. 可变性:集合可以是可变的,也可以是不可变的。例如,您可以向 List 和 Map 等可变集合添加、更新和删除元素。
  2. 急切求值:对集合的操作通常是急切执行的,这意味着它们在被调用时立即执行。
  3. 内存消耗:集合可能会消耗更多内存,尤其是在频繁添加或删除元素时。
  4. 并行性:集合通常缺乏对操作的原生并行支持。
  5. 用例:集合适用于涉及存储、修改和传统元素迭代的任务。

Java 流

Java 中的流为处理元素序列提供了一种函数式方法。它们允许您以声明式和简洁的方式对数据执行操作。

流的特点

  1. 不可变性:流被设计为不可变的;它们不会修改底层源数据。
  2. 惰性求值:流操作是按需评估的,并且是惰性的。这可以通过避免不必要的计算来优化性能。
  3. 内存效率:由于其不可变性和按需处理元素的能力,流通常具有内存效率。
  4. 并行性:流具有内置的并行支持,允许在多个核心上并行执行操作。
  5. 用例:流适用于数据转换、过滤、排序和并行处理。

集合与流的区别

方面集合
目的存储和操作对象组。以函数式风格处理和操作数据。
可变性可以是可变的(添加、更新、删除元素)。不可变;不修改底层源。
惰性求值不一定是惰性的;操作是急切执行的。本质上是惰性的;操作是按需评估的。
数据源数据存储在内存中。可以处理各种源(例如,集合、数组、文件)。
中间操作对数据进行转换操作。中间操作,如 map、filter 等。
终端操作产生结果或副作用的操作。最终操作,如 forEach、reduce、collect 等。
并行性并行支持有限(外部迭代)。内置并行支持,以提高性能。
内存效率由于可变性,可能消耗更多内存。由于不可变性,通常内存效率更高。
用例数据存储、修改、传统处理。数据转换、过滤、并行处理。

集合示例

CollectionsMapExample.java

输出

Using a collection (Map):
Student ID: 1, Name: Alice
Student ID: 2, Name: Bob
Student ID: 3, Name: Charlie 

解释

在此示例中,我们首先导入处理 Map 所需的类。我们创建了一个名为 studentNames() 的 HashMap 来存储与 ID 关联的学生姓名。然后,我们使用 put 方法向 Map 添加了三个条目。

for-each 循环遍历 Map 的 entrySet(),其中每个条目代表一个键值对。在循环中,我们分别使用 entry.getKey() 和 entry.getValue() 提取键和值。这使我们能够打印出每个学生的 ID 和姓名信息。

流示例

StreamsExample.java

输出

Using streams to filter and print:
Alice
Charlie

解释

在此示例中,我们创建一个姓名列表,并使用流过滤掉长度大于四个字符的姓名。然后,我们将过滤后的姓名收集到一个新列表中,并使用流的 forEach 终端操作打印它们。

结论

集合和流都是 Java 开发人员工具箱中有价值的工具,它们各自具有独特的优点和用例。集合非常适合存储和修改数据,而流在函数式风格的数据转换和并行处理方面表现出色。了解它们的区别并根据手头的任务选择合适的机制,可以显著提高代码的可读性、性能和可维护性。


下一主题Java 中的 F