2017-04-12 53 views
0

我做了一些PoC来比较两种类型的实现交互列表的性能。项目开发中所需的Lambda

第一个人使用纯java使用foreach并检查'if'每个元素。

第二种方法是使用lambda这样的:

int max1 = lists1.stream() 
        .mapToInt(i -> i) 
        .max() 
        .getAsInt(); 

long finalCount = lists1.stream() 
         .filter(p -> p.intValue() == max1) 
         .count(); 

显然使用lambda为5的时间比使用传统的Java foreach更快。

我感觉非常有信心在我目前的项目中强制使用lambda作为规则,禁止使用经典的java foreach

我的问题是,如果有,我可以不适用此规则(需要拉姆达),我的意思是,如果存在例外,我无法使用lambda使用集合一些场景。

+5

不要。这个微型基准不会“证明”任何东西。 –

+1

并不是一切都是关于表现,你错过了这一点。 –

+3

这是一个意见问题。您的测试存在缺陷。所有流都比传统循环更快并不明显。 –

回答

2

绝对的第一件事 - 基准Java代码是complicated。 含义:除非您确实已遵循之前链接中列出的规则,否则您的衡量结果很可能是虚假的。

除此之外:lambdas确实使用invokedynamic字节码指令,这反过来又可以提高性能。

但是,这并不能支持为整个团队强制执行这样的政策。

真正的答案是:让您的团队了解溪流和lambda的优缺点。使他们能够在何时以及如何利用这些概念时做出明智的决定。确保人们了解他们正在做什么,而不是给他们一个清单,遵循命令。

6

Lambda +流显然更快?并非如此。

这很大程度上取决于情况,但总的来说,Java 7循环比流更快,因为发生的次数较少。

回答你的问题:“否”;你不应该要求lambda总是被使用,因为:

  • 这是一种风格的东西;这两种形式都是可以接受的,当实现为流
  • 你的理由是毫无根据
  • 可读性几乎总是胜过“性能”

对于并行流处理可以更快

  • 有些循环变成火车残骸,但只有当流足够大才能证明管理流的开销。作为一个经验法则,如果您至少有1000个要处理的元素,请尝试一个流。