当前位置: 首页 > 知识库问答 >
问题:

流是否有可变还原操作(收集器)?

陶修洁
2023-03-14

AFAIK对BigDecimal流求和的唯一方法是:

BigDecimal result = stream.reduce(BigDecimal.ZERO, BigDecimal::add);

这里的问题是,每次调用BigDecimal::add都会创建一个新的BigDecimal,而不是更改可变类型。

对于流,是否存在可变的缩减操作,即收集器


共有2个答案

潘琨
2023-03-14

嗯,没有公共可变的BigDecimal伴随类,所以没有使用它的Collector。但是您不应该担心实例创建的性能影响,除非分析工具告诉您有问题。

像HotSpot这样的现代JVM通常擅长处理在热循环中创建的临时对象。即使他们不能免除分配,分配成本也没有那么大。这不同于,例如,String::concat,其中实例创建成本不仅包括分配,还包括复制先前创建的String实例的全部内容,从而产生这种减少的二次时间复杂度(除非优化器设法重写这样的代码)。这同样适用于通过纯(不可变)归约生成集合的尝试。

这可能与诸如IntStreamLongStreamDoubleStream等基本类型专门化的存在相矛盾,但这是一种折衷。通常,JRE开发人员倾向于提高JVM性能(为了所有值类型的利益),而不是为每个不可变的类添加可变的帮助器类。在完全值类型支持到来之前,可能会有对基本类型的特殊支持的连续性,但不要期望为不可变类型添加新的公共可变伴生类(除非我们在String示例中讨论构造成本)。

甄永年
2023-03-14

BigDecimal:“不可变、任意精度有符号十进制数。”

因为它是不可变的,所以没有方法在不创建新对象的情况下操作它们。任何可以这样做的方法都会破坏类的保证(比如BigDecimal.ZERO是0)

 类似资料:
  • 我正在编写一个带有事务回滚的简单json数据库。我需要向一个文件追加一行文本,然后根据追加是否成功,将成功或失败记录到另一个文件。如果需要,第二个文件用于回滚。因此,在继续之前,我需要确定写操作是否成功。 我使用stream.write追加我的文本行,其中包括一个回调,应该验证写操作的成功或失败。 然后我在下面的URL上的NodeJS文档中读到了这个不幸的消息https://nodejs.org/

  • 不保留顺序。我可以使用列表,但我想指出,生成的集合不允许元素重复,这正是接口的用途。

  • 问题内容: 在深入研究之后,我发现Stream和Collector之间存在许多重复的逻辑,这些逻辑违反了不要重复自己的原则,例如:jdk-9和中的Stream#map&Collectors#mapping,Stream#filter&Collectors#filtering。等等 但自从溪流遵守告诉,不要问得墨meter耳的法则/ 得墨Law律和集热器遵守继承构成原则看来,这是合理的。 我只能想到

  • 请允许我提出一些抱怨,也许是令人厌烦但我想描述的是:“为什么会提出这个问题呢?”。我昨天晚上在这里、这里、这里回答的问题和其他人不一样。 Stream operations在做一些简单的工作时比Collector更有表现力,但是它们比Collector更慢,因为它会为每个操作创建一个新的Stream,并且Stream比Collector更繁重和抽象。例如: 收集器无法将短路终端操作作为流应用。例如

  • 我正在为新手程序员编写一个库,所以我试图保持API尽可能干净。 我的库需要做的事情之一是对大量的ints或long集合执行一些复杂的计算。我的用户需要从许多场景和业务对象中计算这些值,因此我认为最好的方法是使用流来允许用户将业务对象映射到或,然后在收集器中计算这些计算。 所以与其能够做到 我必须提供这样的供应商、累加器和组合器: 这对我的新手用户来说太复杂了,而且很容易出错。 在使用或的同时,是否

  • 问题内容: 下面的代码是否需要包装在try-with-resources中,以确保基础文件已关闭? 问题答案: 作为重载方法状态的javadoc 返回的流封装了。如果需要及时处理文件系统资源,则应使用该构造来确保在流操作完成之后调用流的close方法。 所以是的,在语句中包装返回的。(或适当关闭它。)