Java 8函数<string,void =“”> vs Consumer <string>

时间:2015-12-16 15:53:49

标签: java lambda java-8 runnable callable

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

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>

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

有人可以解释一下它的杀戮。

提前致谢!

1 个答案:

答案 0 :(得分:9)

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

Void m(String s);

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

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

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

按预期编译。