Stream<BigDecimal> 是否有一个可变的缩减操作(Collector)?
Is there a mutable reduction operation(Collector) for Stream<BigDecimal>?
据我所知,对 BigDecimal
流求和的唯一方法是:
BigDecimal result = stream.reduce(BigDecimal.ZERO, BigDecimal::add);
这里的问题是每次调用 BigDecimal::add
都会创建一个新的 BigDecimal
而不是更改可变类型。
Stream<BigDecimal>
是否有可变归约操作又名 Collector
?
BigDecimal: "Immutable, arbitrary-precision signed decimal numbers."
由于它是不可变的,所以没有方法可以在不创建新对象的情况下操纵它们。任何可以做到这一点的方法都会破坏 class 的保证(比如 BigDecimal.ZERO 为 0)
嗯,没有 public 可变 BigDecimal
伴侣 class,所以没有 Collector
使用它。但是您不必担心实例创建对性能的影响,除非分析工具告诉您存在问题。
像 HotSpot 这样的现代 JVM 通常擅长处理在热循环中创建的临时对象。即使他们不能省略分配,分配成本也没有那么大。这不同于,例如String::concat
其中实例创建成本不仅包括分配,还包括复制先前创建的 String
实例的全部内容,产生这种减少的二次时间复杂度(除非优化器设法重写此类代码).这同样适用于通过纯(不可变)减少产生 Collection
的尝试。
这可能与 IntStream
、LongStream
和 DoubleStream
等原始类型特化的存在相矛盾,但这是一种权衡。通常,JRE 开发人员的偏好是提高 JVM 性能(为了 all 值类型的好处)而不是为每个不可变 [=27] 添加一个可变助手 class =].在完整的值类型支持到来之前,可能会有对原始类型的特殊支持的连续性,但不要指望为不可变类型添加新的 public 可变伴侣 classes(除非我们像 String
示例中那样谈论建筑成本)。
据我所知,对 BigDecimal
流求和的唯一方法是:
BigDecimal result = stream.reduce(BigDecimal.ZERO, BigDecimal::add);
这里的问题是每次调用 BigDecimal::add
都会创建一个新的 BigDecimal
而不是更改可变类型。
Stream<BigDecimal>
是否有可变归约操作又名 Collector
?
BigDecimal: "Immutable, arbitrary-precision signed decimal numbers."
由于它是不可变的,所以没有方法可以在不创建新对象的情况下操纵它们。任何可以做到这一点的方法都会破坏 class 的保证(比如 BigDecimal.ZERO 为 0)
嗯,没有 public 可变 BigDecimal
伴侣 class,所以没有 Collector
使用它。但是您不必担心实例创建对性能的影响,除非分析工具告诉您存在问题。
像 HotSpot 这样的现代 JVM 通常擅长处理在热循环中创建的临时对象。即使他们不能省略分配,分配成本也没有那么大。这不同于,例如String::concat
其中实例创建成本不仅包括分配,还包括复制先前创建的 String
实例的全部内容,产生这种减少的二次时间复杂度(除非优化器设法重写此类代码).这同样适用于通过纯(不可变)减少产生 Collection
的尝试。
这可能与 IntStream
、LongStream
和 DoubleStream
等原始类型特化的存在相矛盾,但这是一种权衡。通常,JRE 开发人员的偏好是提高 JVM 性能(为了 all 值类型的好处)而不是为每个不可变 [=27] 添加一个可变助手 class =].在完整的值类型支持到来之前,可能会有对原始类型的特殊支持的连续性,但不要指望为不可变类型添加新的 public 可变伴侣 classes(除非我们像 String
示例中那样谈论建筑成本)。