有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

lambda Java 8函数<String,Void>vs消费者<String>

我一生都找不到以下的解释:

public static void takesAFunction(Function<String, Void> func) {
    func.apply("Hi I'm running a function");
}

public static void takesAConsumer(Consumer<String> func) {
    func.accept("Hi I'm running a consumer");
}

public static void main(String[] args) throws Exception {
    takesAFunction((String str) -> { System.out.println(str); });
    takesAConsumer((String str) -> { System.out.println(str); });
}

我正在使用JDK 1.8.0_66和该行

takesAFunction((String str) -> { System.out.println(str); });

被标记为错误,表示

The method takesAFunction(Function<String,Void>) in the type MyClass 
is not applicable for the arguments ((String str) -> {})

我不明白这是怎么回事

Function<String, Void> 

不同于

Consumer<String>

当两者都不返回任何内容并且都接受单个字符串参数时

有人能解释一下这件事吗,因为它会杀人

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    A Function<String, Void>应具有以下签名:

    Void m(String s);
    

    不要与void m(String s);混淆

    因此,您需要返回一个Void值,唯一可用的值是null

    takesAFunction((String str) -> {
      System.out.println(str);
      return null;
    });
    

    按预期编译