我在做什么错java 8 lambda Predicate <Integer>?
这个问题在这里已经有了答案:
首先,让我们看看事物的规模。 你谈论的是100000000个物品差异大约1505毫秒,或者说每个物品大约15纳秒。 这种开销不大。
也就是说,为了Predicate<Integer>
的缘故,开销是将所有这些int
自动装箱到Integers
中。 Predicate::test
需要一个Integer
,所以p.test(i)
真正被编译为p.test(Integer.valueOf(i))
。 该方法不是超级昂贵,但它不是免费的。 显然,你的电脑大概需要15纳秒。
如果你使用一个IntPredicate
它使用一个int
基元作为它的输入,从而避免了装箱 - 你会发现直接和基于lambda的方法之间的区别实际上已经消失了。
除此之外,还有关于Java中微基准的常见警告(热身循环,使用JMH等框架)。 关于这个主题有很多知识,如果你想继续对这种快速行为进行基准测试,我强烈建议你阅读它。
性能和lambda可能会很棘手。 在你的情况下使用包装类型整数和自动装箱减慢东西。
开关
public long sumAllLambda(Predicate<Integer> p)
至
public long sumAllLambda(IntPredicate p)
结果几乎相同
Total execution time conv: 3190
Total execution time lambda: 3037
lambda / conv : 0.95203763
链接地址: http://www.djcxy.com/p/86545.html
上一篇: What am i doing wrong with java 8 lambda Predicate<Integer>?