现在,这是另一种情况:
Arrays.asList("hello", "world").stream().forEach(System.out::println);
这样可以编译并运行…
好的,在最后一个问题中,使用了来自 类的 静态方法。
但是现在不同了:System.out
是的static
字段System
,是;在这种情况下,它也是a PrintStream
,并且a
PrintStream
具有println()
碰巧匹配a的签名的方法Consumer
,而a
Consumer
是forEach()
期望的方法
。
所以我尝试了这个
public final class Main
{
public static void main(final String... args)
{
Arrays.asList(23, 2389, 19).stream().forEach(new Main()::meh);
}
// Matches the signature of a Consumer<? super Integer>...
public void meh(final Integer ignored)
{
System.out.println("meh");
}
}
而且有效!
这是一个完全不同的范围,因为我启动了一个新实例,并且可以在构造该实例之后立即使用方法引用!
那么,方法引用真的是 任何 遵循签名的方法吗?有什么限制?在任何情况下都可以构建“ @FunctionalInterface兼容”方法,而该
方法不能 在@FunctionalInterface
?中使用?
方法引用的语法在JLS#15.13中定义。特别是可以采用以下形式:
Primary :: [TypeArguments] Identifier
Primary
除其他事项外,哪里可以是:
ClassInstanceCreationExpression
是的,您的语法正确。其他一些有趣的例子:
this::someInstanceMethod // (...) -> this.someInstanceMethod(...)
"123"::equals // (s) -> "123".equals(s)
(b ? "123" : "456")::equals // where b is a boolean
array[1]::length // (String[] array) -> array[1].length()
String[]::new // i -> new String[i]
a.b()::c // (...) -> a.b().c(...)
顺便说一句,由于您提到了静态方法,因此有趣的是您不能从实例创建静态方法引用:
class Static { static void m() {} }
Static s = new Static();
s.m(); //compiles
someStream.forEach(s::m); //does not compile
someStream.forEach(Static::m); //that's ok
它编译,并工作... 好的,在最后一个问题中,使用了一个类中的静态方法。 但现在不同了:是的字段,是的;它也是一个,有一个方法,在本例中,该方法恰好与的签名匹配,而所期望的是。 这里是一个完全不同的范围,因为我启动了一个新的实例,并且可以在这个实例构建后立即使用方法引用! 那么,方法引用真的是任何服从签名的方法吗?有什么限制?是否存在可以构建“@functionalinterface兼容”的方法而
我今天读了这篇关于lambdas的文章: http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood 本文建议,lambda不是作为一个非内部类实现的(由于性能原因)。它给出了一个示例,可以将lambda表达式编译为类的(静态)方法。 我尝试了一个非常简单的片段: 输出是: 所以这不是同一个实例。它也不是一些中央的“Lamb
注意:这个问题源自一个死的链接,这是以前的一个SO问题,但这里是... 看到这段代码(注意:我确实知道这段代码不会“工作”,应该使用--我只是从链接的问题中提取出来的): 根据和的javadoc,两者的参数都应该是一个。然而,这里的方法引用是类的静态方法。
我很难理解为什么要编译以下代码: 我可以理解为什么第一个赋值是有效的-
问题内容: 注意:这个问题源自于先前的SO问题的无效链接,但是这里… 参见下面的代码(注意:我确实知道该代码不会“起作用”,应该使用-我只是从链接的问题中提取了它): 据javadoc的和,两者的参数应该是一个。然而,这里的方法引用是针对Integer该类的静态方法的。 那么,为什么要编译呢? 问题答案: 让我解释一下这里发生的事情,因为它并不明显! 首先,接受的一个实例,以便可以将流中的项目彼此
本文向大家介绍什么是预编译,何时需要预编译:相关面试题,主要包含被问及什么是预编译,何时需要预编译:时的应答技巧和注意事项,需要的朋友参考一下 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。