我看到java-10为IntSummaryStatistics (LongSummaryStatistics和DoubleSummaryStatistics)添加了一个构造函数,该构造函数包含4个参数,即count、min、max和sum。
我理解为什么存在no-args构造函数,以便将其用于精简,例如:
..stream().collect(Collectors.summarizingInt(Class::someFunction))这是合理的,但是为什么需要添加带有4个参数的构造函数呢?(我在自己的回答中作了一个假设,但如果不是这样的话,我很乐意收回它。)
发布于 2018-03-06 09:22:54
请注意,虽然这样的优化在引用实现中今天并不发生,但像IntStream.rangeClosed(from, to).summaryStatistics()这样的操作并不需要对所有值进行实际迭代。
它可以简单地返回
new IntSummaryStatistics((long)to-from+1, from, to, ((long)from+to)*((long)to-from+1)/2)。
如前所述,这种优化不是今天发生的,而是一个例子,有时可以不用迭代每个值来计算这样的统计数据,因此,唯一填充xxxSummaryStatistics的方法是accept对单个值(和combine,但这需要一个已经存在的统计实例,必须以某种方式填充)这是一个很大的限制。
发布于 2018-03-05 08:46:38
如果在某个地方使用了这些构造函数,我尝试过搜索源代码,但我不能。
所以我唯一的想法是,它是用来手工构造这样一个对象的。假设我们有一个计算所有这些平均值、最小值、最大值、计数的方法,而不是返回一个由4个参数组成的array/List,您可以返回一个IntSummaryStatistics,以前这是不可能的。所以,我想,这只是扩展了API,而没有(还没有?)任何内部用途。
来自相对CSR的精确信息:-
Problem:不可能从它的记录值重建*SummaryStatistics。例如,被“克隆”或以串行形式传送并重组。
解决方案:向接受预先记录状态的*SummaryStatistics添加构造函数。
发布于 2018-03-05 12:04:18
除了使用这样一个构造函数(需要)的答案之外,为了关心API实现的正确性,人们应该真正考虑到大声的API说明,这样创建这类事例就像(强调我的)一样受到一些深思熟虑的考虑-
如果
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、sum、max和min组合的所有类型的检查,所以有这样的语句(我在处理构造函数时发现了这个语句)。
参数正确性的强制执行意味着从
*SummaryStatistics源实例检索到的记录值集可能不是此构造函数的合法参数集,因为源记录的值计数的算术溢出。一致的参数条件不足以阻止创建内部不一致的实例。这种状态的一个例子是一个(IntSummaryStatistics)实例,它具有: count = 2,min = 1,max =2和sum = 0。
另外,当combine(http://download.java.net/java/jdk10/docs/api/java/util/IntSummaryStatistics.html#combine(java.util.IntSummaryStatistics%29)d和其他*SummaryStatistic )可能进一步导致非法的参数集时,这种错误创建的实例。
https://stackoverflow.com/questions/49106467
复制相似问题