Java中Collection与Stream比较

在Java中,集合和流是用于处理和处理数据的两个不同的概念,并且它们具有不同的目的。

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

  • Java 中的集合表示对象或元素的组。常见的集合类型包括列表、集合和映射。
  • 它们提供了一种存储、检索和操作对象组的方法。

特点

  • 可变性:集合可以是可变的,也可以是不可变的。例如,您可以从可变集合(如列表和映射)中添加、更新和删除元素。
  • 急切求值:对集合的操作通常是热切执行的,这意味着它们在被调用时立即执行。这意味着当创建或修改集合时,数据将被计算并存储在内存中。
  • 内存:集合可能会消耗更多内存,尤其是在频繁添加或删除元素时。
  • 并行:集合通常缺乏对操作的内置并行性支持。
  • 迭代:您可以使用迭代器、增强的 for 循环或特定集合类型提供的其他迭代方法来迭代集合中的元素。

代码
List<String> list = new ArrayList<>();
list.add("Apple");
list.add(
"Banana");
list.add(
"Orange");


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

  • Java 中的流表示可以并行或顺序处理的元素序列。
  • 它们提供了用于处理数据集合的函数式编程风格。

流的特点

  • 不可变性:流通常是不可变的。对流的操作不会修改底层数据源;相反,他们创建一个新的流。
  • 惰性求值:流操作是按需求值的,本质上是惰性的。这可以通过避免不必要的计算来优化性能。流使用惰性求值。这意味着在调用终端操作之前不会执行流上的操作。
  • 管道:流允许您创建操作管道(例如,过滤器、映射、化简),以声明性且简洁的方式处理数据。
  • 内存效率:由于流的不可变性和动态处理元素的能力,流通常具有内存效率。
  • 并行性:流具有内置并行性支持,允许在多个内核上同时执行操作。
  • 使用案例:流适用于数据转换、过滤、排序和并行处理。

List<String> fruits = Arrays.asList("Apple", "Banana", "Orange");
long count = fruits.stream()
                   .filter(fruit -> fruit.startsWith(
"A"))
                   .count();


何时使用

  • 集合:
    • 当您需要存储、检索和修改一组元素时,请使用集合。
    • 当热切评估可以接受或首选时使用。
    • 非常适合需要对数据进行多次迭代或修改的场景。
  • 流:
    • 使用流对数据进行函数式处理,重点是转换、过滤和聚合。
    • 当延迟计算有益时使用,尤其是处理大型数据集时。
    • 适用于并行处理,有可能提高多核系统的性能。

在许多情况下,您可能会发现集合和流的组合是最有效的方法,具体取决于应用程序的具体要求。