繁体   English   中英

我对 java function 签名有疑问

[英]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> ,因此TAppKString 换句话说,您需要一个接受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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM