Java 8函数<String,Void> vs Consumer <String>

RVP*_*RVP 4 java lambda callable runnable java-8

我不能为我的生活找到以下的解释:

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); });
}
Run Code Online (Sandbox Code Playgroud)

我正在使用JDK 1.8.0_66和该行

takesAFunction((String str) -> { System.out.println(str); });
Run Code Online (Sandbox Code Playgroud)

被标记为错误

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

我不明白是怎么回事

Function<String, Void> 
Run Code Online (Sandbox Code Playgroud)

不同于

Consumer<String>
Run Code Online (Sandbox Code Playgroud)

当两者都不返回并且都接受单个String参数时.

有人可以解释一下它是否会被杀死.

提前致谢!

ass*_*ias 10

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

Void m(String s);
Run Code Online (Sandbox Code Playgroud)

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

所以你需要返回一个Void值 - 唯一可用的是null:

takesAFunction((String str) -> {
  System.out.println(str);
  return null;
});
Run Code Online (Sandbox Code Playgroud)

按预期编译.