7

我看到为(和)java-10添加了一个构造函数,它接受 4 个参数,即、和。IntSummaryStatisticsLongSummaryStatisticsDoubleSummaryStatisticscountminmaxsum

我理解为什么存在无参数构造函数,以便将其用于减少,例如:

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

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

4

3 回答 3

5

如果这些构造函数在某处使用但我不能,我试图搜索源。

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


相对的企业社会责任来看:-

问题:无法*SummaryStatistics从记录的值中重建。例如被“克隆”或以串行形式传输并重组

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

于 2018-03-05T08:46:38.370 回答
3
于 2018-03-06T09:22:54.360 回答
2

除了对这种构造函数的使用(需要)的回答之外,要关注 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 则抛出 an。必要的一致论证条件是:

  • 计数 >= 0
  • 最小值 <= 最大值

但是由于这并不涵盖对用户可以输入的值的所有类型的检查,count因此有这个语句(我在使用构造函数时发现)summaxmin

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

combine此外,当d 与 other时,此类错误创建的实例*SummaryStatistic可能会进一步导致一组非法参数。

于 2018-03-05T12:04:18.977 回答