[英]i have question about java function signature
我发现 function 接口和 getMethod 似乎可以替换,是什么让它起作用?
public class App {
public static void main(String[] args) {
Map<String, String> collect = Stream.of(new App(), new App(), new App())
.collect(Collectors.toMap(App::getString, (app) -> "aaa"));
}
public String getString() {
return "str";
}
}
但是当我使用 lambda 替换 getMethod 时,它失败了。 为什么这不起作用
Map<String, String> collect = Stream.of(new App(), new App(), new App())
.collect(Collectors.toMap(() -> "str", (app) -> "aaa"));
Collectors.toMap
需要一个Function<? super T, ? extends K>
Function<? super T, ? extends K>
Function<? super T, ? extends K>
作为它的第一个参数,其中T
是 stream 中元素的类型, K
是你想要的 map 的 key 类型。
在这种情况下,您有一个App
的 stream 并且您想要一个Map<String, String>
,因此T
是App
而K
是String
。 换句话说,您需要一个接受App
并返回String
的 function 。
App::getString
就是这样一个Function<? super T, ? extends K>
Function<? super T, ? extends K>
Function<? super T, ? extends K>
。 您可能想知道为什么getString
不接受任何参数时它会接受App
。 请注意getString
是一个实例方法,而您是在没有实例的情况下引用它! ClassName::instanceMethodName
形式的方法引用隐式接受ClassName
类型的额外参数,因为您需要该 class 的实例来调用它!
另一方面,您的 lambda 不是这样的 function。 它不接受任何参数,如开头 ( ()
) 处的空括号所示。 您的 lambda 表达式将由Supplier<String>
功能接口表示,而不是您需要的Function<App, String>
。
要在此处使用 lambda 表达式,只需对 toMap 的第二个参数执行您对toMap
的第二个参数所做的操作,然后添加一个 lambda 参数:
.collect(Collectors.toMap((app) -> "str", (app) -> "aaa"));
// ^^^
请注意,即使您不在 lambda 表达式中使用app
,这也是必需的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.