Java 流会产生内存开销吗

问题描述 投票:0回答:1

我从java流的基本原理中得到的是,它适用于不可变对象,并进行操作和收集(如果我们将其作为集合收集)作为新的不可变对象。 我的困惑是,这是否意味着任何对象都有两个对象实例

  1. 手术前一次以及
  2. 手术后一张

如果是这样,这是否意味着对于内存是问题的应用程序,流操作可能会产生内存开销。

java functional-programming jvm java-stream
1个回答
0
投票
  • 流本身不是数据结构。它们代表一个序列 要在底层数据源上执行的操作(例如 列表)。
  • 虽然原始数据源可能是不可变的(例如,
    List.of()
    ),但中间操作可以创建新的集合。
  • 例如,列表上的
    map(x -> x * 2)
    会创建一个具有双倍值的新列表。

流操作可以通过两种方式引入内存开销:

  1. 中间操作:如前所述,这些操作可能会创建新的集合来保存临时结果。如果链接多个中间操作,这可能会累积。
  2. 终端操作:某些终端操作(如
    collect(toList())
    )还会创建一个新集合来存储最终结果。

减少内存开销:

支持不需要新集合的终端操作:

  • forEach 直接消费流元素,而不创建新的集合。
  • 在某些情况下,reduce 可以累积结果而不创建中间集合。

注意中间操作:

  • 避免在不需要时创建新集合的不必要的中间操作。
  • 如果需要重用中间结果,请考虑将它们存储在变量中,而不是依赖链接操作。
© www.soinside.com 2019 - 2024. All rights reserved.