当前位置: 首页 > 知识库问答 >
问题:

Java8流,为什么要编译第2部分...或者什么是方法引用,真的吗?

袁羽
2023-03-14
Arrays.asList("hello", "world").stream().forEach(System.out::println);

它编译,并工作...

好的,在最后一个问题中,使用了一个类中的静态方法。

但现在不同了:system.outsystem静态字段,是的;它也是一个printstreamprintstream有一个println()方法,在本例中,该方法恰好与使用者的签名匹配,而foreach()所期望的是printstream

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中使用的情况?

共有1个答案

凌智
2023-03-14

方法引用的语法在JLS#15.13中定义。具体而言,它的形式可以是:

主要::[TypeArguments]标识符

其中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
 类似资料:
  • 问题内容: 现在,这是另一种情况: 这样可以编译并运行… 好的,在最后一个问题中,使用了来自 类的 静态方法。 但是现在不同了:是的字段,是;在这种情况下,它也是a ,并且a 具有碰巧匹配a的签名的方法,而a 是期望的方法 。 所以我尝试了这个 而且有效! 这是一个完全不同的范围,因为我启动了一个新实例,并且可以在构造该实例之后立即使用方法引用! 那么,方法引用真的是 任何 遵循签名的方法吗?有什

  • 注意:这个问题源自一个死的链接,这是以前的一个SO问题,但这里是... 看到这段代码(注意:我确实知道这段代码不会“工作”,应该使用--我只是从链接的问题中提取出来的): 根据和的javadoc,两者的参数都应该是一个。然而,这里的方法引用是类的静态方法。

  • 我很难理解为什么要编译以下代码: 我可以理解为什么第一个赋值是有效的-

  • 我今天读了这篇关于lambdas的文章: http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood 本文建议,lambda不是作为一个非内部类实现的(由于性能原因)。它给出了一个示例,可以将lambda表达式编译为类的(静态)方法。 我尝试了一个非常简单的片段: 输出是: 所以这不是同一个实例。它也不是一些中央的“Lamb

  • 为什么要用 this? 如果对于那些老练的 JavaScript 开发者来说 this 机制都是如此的令人费解,那么有人会问为什么这种机制会有用?它带来的麻烦不是比好处多吗?在讲解 如何 有用之前,我们应当先来看看 为什么 有用。 让我们试着展示一下 this 的动机和用途: function identify() { return this.name.toUpperCase(); } f

  • 问题内容: 这段代码使我凝视了几分钟: 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 这不是一个。 用法: