XXXSummaryStatistics java-10中的新构造函数

问题描述 投票:7回答:3

我看到java-10IntSummaryStatisticsLongSummaryStatisticsDoubleSummaryStatistics)添加了一个构造函数,它有4个参数,分别是countminmaxsum

我理解为什么no-args构造函数存在,所以它将用于简化,如:

 ..stream().collect(Collectors.summarizingInt(Class::someFunction))

这是有道理的,但为什么需要添加带有4个参数的构造函数? (我在自己的答案中做了一个假设,但如果不是这样的话,我很乐意收回它。)

java java-stream java-10
3个回答
3
投票

请注意,虽然今天在参考实现中没有发生这种优化,但像IntStream.rangeClosed(from, to).summaryStatistics()这样的操作不需要实际迭代所有值。

它可以简单地返回 new IntSummaryStatistics((long)to-from+1, from, to, ((long)from+to)*((long)to-from+1)/2)

如上所述,这种优化今天不会发生,但有一个例子,有时,有一些方法可以计算这样的统计数据,而不必迭代每个值,所以这是一个重要的限制,填充xxxSummaryStatistics的唯一方法是accept​ing个别值(和combine,但这需要一个必须以某种方式填充的已经存在的统计实例)。


5
投票

我试图搜索源代码,如果这些构造函数在某个地方使用,我不能。

所以我唯一的想法是它用于手动构造这样的Object。假设我们有一个计算所有这些平均值,最小值,最大值,计数的方法,而不是返回4个参数的array/List,你可以返回一个IntSummaryStatistics,以前这是不可能的。所以,我想,这只是扩展了API而没有(还有?)任何内部用法。


relative CSR准确地说: -

问题:无法从记录的值重建*SummaryStatistics。例如,“克隆”或以连续形式传播并重构。

解决方案:向*SummaryStatistics添加构造函数,接受预先记录的状态。


1
投票

除了这种构造函数的使用(需要)的答案之外,为了关注API实现的正确性,人们应该真正考虑所谓的大声API注释,以便such instances的创建在某些深思熟虑的考虑因素下(强调我的) -

如果count为零,则忽略其余参数并构造一个空实例。

示例 -

var intsummstats = new IntSummaryStatistics();
// creates the following stat
=> IntSummaryStatistics{count=0, sum=0, min=2147483647, average=0.000000, max=-2147483648}

// and the  following results into a similar stat as well
var anotherintsummstats = new IntSummaryStatistics(0, 12, 100, 1000);
=> IntSummaryStatistics{count=0, sum=0, min=2147483647, average=0.000000, max=-2147483648}

如果参数不一致,则抛出IllegalArgumentException。必要的一致参数条件是:

  • count> = 0
  • min <=最大

但是,由于这不包括用户可以放入的countsummaxmin组合的所有类型的检查,有这个声明(我在玩构造函数时发现)

参数正确性的强制执行意味着从*SummaryStatistics源实例获取的检索的记录值集合可能不是该构造函数的合法参数集,因为源的记录的值计数的算术溢出。一致的参数条件不足以防止创建内部不一致的实例。这种状态的一个例子是(IntSummaryStatistics)实例,其中:count = 2,min = 1,max = 2,sum = 0。

并且,当combined与其他*SummaryStatistic进一步导致非法的参数集时,这种错误创建的实例会添加到其中。

© www.soinside.com 2019 - 2024. All rights reserved.