方法引用是否跳过了lambda包装器的开销?他们将来可能吗?
有时... lambda表达式除了调用现有方法外什么也不做。在这种情况下,通常更容易按名称引用现有方法。方法引用使您可以执行此操作;它们是紧凑的,易于阅读的lambda表达式,用于已经具有名称的方法。
由于以下几个原因,我更喜欢lambda语法而不是方法引用语法:
Lambda更清晰
尽管有Oracle的主张,但我发现lambda语法比对象方法引用的简写形式更易于阅读,因为方法引用的语法是模棱两可的:
Bar::foo
您是否在x的类上调用静态的一参数方法并将其传递给x?
x -> Bar.foo(x)
还是在x上调用零参数实例方法?
x -> x.foo()
方法参考语法可以代表任何一种。它隐藏了您的代码实际在做什么。
Lambda更安全
如果将Bar :: foo引用为类方法,并且Bar以后添加了同名的实例方法(反之亦然),则代码将不再编译。
您可以始终使用lambda
您可以将任何函数包装在lambda中-因此您可以在所有位置一致地使用相同的语法。方法引用语法不适用于采用或返回原始数组,引发已检查异常或具有与实例和静态方法相同的方法名称的方法(因为该方法引用语法对于调用哪种方法尚不明确) 。当您使用相同数量的参数重载方法时,它们不起作用,但是无论如何您都不应这样做(请参见Josh Bloch的第41项),因此我们不能将其与方法引用相对应。
结论
如果这样做不影响性能,我很想在我的IDE中关闭警告,并始终使用lambda语法,而不会将偶然的方法引用散布到我的代码中。
聚苯乙烯
无论在这里还是那里,但在我的梦中,对象方法引用看起来都更像这样,并且无需lambda包装器就直接在对象上对方法应用invoke-dynamic:
_.foo()
.map(_.acceptValue())
:如果我没记错的话,这看起来非常像Scala语法。也许您只是在尝试使用错误的语言。
System.out::println
给forEach()
所有的时间...?