java 8如何仅从SummaryStatistics返回sum和count值
我们都知道,SummaryStatistics包含count、sum、min、average和max值。 如果只返回count和sum值是否可能更有效?如果是,如何实现 您可以编辑以下代码以向我显示:java 8如何仅从SummaryStatistics返回sum和count值,java,functional-programming,java-8,Java,Functional Programming,Java 8,我们都知道,SummaryStatistics包含count、sum、min、average和max值。 如果只返回count和sum值是否可能更有效?如果是,如何实现 您可以编辑以下代码以向我显示: Stream.of(0.55f, 0.45f, 0.5f, 0.65f, 0f). filter(i -> i > 0.5).mapToInt(i -> (int) (i * 100 - 50)).summaryStatistics() 谢谢如果我理解正
Stream.of(0.55f, 0.45f, 0.5f, 0.65f, 0f).
filter(i -> i > 0.5).mapToInt(i -> (int) (i * 100 - 50)).summaryStatistics()
谢谢如果我理解正确,您会问是否应该遍历源代码两次或一次,并使用
IntSummaryStatistics
。这样会更便宜吗
Stream.of(0.55f, 0.45f, 0.5f, 0.65f, 0f)
.filter(i -> i > 0.5)
.mapToInt(i -> (int) (i * 100 - 50))
.count();
Stream.of(0.55f, 0.45f, 0.5f, 0.65f, 0f)
.filter(i -> i > 0.5)
.mapToInt(i -> (int) (i * 100 - 50))
.sum();
与:
IntSummaryStatistics summaryStatistics = Stream.of(0.55f, 0.45f, 0.5f, 0.65f, 0f)
.filter(i -> i > 0.5)
.mapToInt(i -> (int) (i * 100 - 50))
.summaryStatistics();
summaryStatistics.getSum();
summaryStatistics.getCount();
不进行测量很难说,但是请注意,如果使用count
时没有清除size
标志的操作,则可以完全跳过某些操作。例如:
long result = Stream.of(1, 2, 3, 4, 5)
.mapToInt(x -> {
System.out.println("mapping");
return x;
})
.count();
System.out.println(result);
这里根本不需要处理mapToInt
——事实上,在java-9中,这将被跳过。对于总是计算计数的IntSummaryStatistics
,不会进行相同的优化。在你的例子中,情况并非如此,但要知道这是一件好事
既然你说你用了
count
和sum
两种方法,我还是会选择IntSummaryStatistics
迭代两次。在IntSummaryStatistics
中执行的另外两个操作是Math.min
和Math.max
什么是SummaryStatistics
…请解释一下…我们是在谈论类似于这里的东西吗?@nullpointer是的,它是IntSummaryStatistics或任何其他类型,如DoubleSummaryStatistics。summaryStatistics是一个方法名。您只希望访问sum和count,那么为什么getSum和getCount对您没有用处呢?很抱歉,这个问题不清楚如果我只返回count和sum值,您所说的更高效是什么意思?使用双流
而不是以流框浮点
s作为起点,将比不计算min
和max
产生更大的影响(平均值仅在您要求时计算).实际上,我的意思是,如果有一种方法可以只获取总和和计数值,因为我不需要IntSummaryStatistics中的其他值。我想知道有没有一种比使用IntSummaryStatistics更有效的方法,可能是自定义收集器或reduce方法,我不知道如何获取它。无论如何,谢谢你的解释,这很好。@RickGeng你可能是寻找一个不存在的性能问题。是的,编写一个自定义收集器是可能的(一点也不难),但是没有必要,你几乎不会感觉到有什么不同