gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:04:50 25 4
gpt4 key购买 nike

好的,这个“系列”中的第一个问题是 this one .

现在,这是另一种情况:

Arrays.asList("hello", "world").stream().forEach(System.out::println);

这会编译并工作...

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

但现在不同了:System.outstatic领域System , 是的;它也是一个PrintStream , 和一个 PrintStream有一个 println()恰好与 Consumer 的签名匹配的方法在这种情况下,a Consumer is what forEach() expects .

所以我尝试了这个...

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 can be, among other things, a:

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

关于Java 8 流,为什么要编译第 2 部分……或者什么是方法引用,真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22663112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com