无法将void转换为java.lang.Void

时间:2015-02-27 10:21:57

标签: java lambda java-8

我试图做以下事情

interface Updater {
    void update(String value);
}

void update(Collection<String> values, Updater updater) {
    update(values, updater::update, 0);
}

void update(Collection<String> values, Function<String, Void> fn, int ignored) {
    // some code
}

但是我得到了这个编译错误:

"Cannot convert void to java.lang.Void"

这意味着updater::update不能用作Function<String, Void>

我当然不能写Function <String, void>,我也不想将update()的返回类型更改为Void

如何解决此问题?

2 个答案:

答案 0 :(得分:29)

Function返回一个值,即使它被声明为Void类型(那么你必须返回null。相比之下,void方法确实没有返回任何内容,甚至不返回null。所以你必须插入return语句:

void update(Collection<String> values, Updater updater) {
    update(values, s -> { updater.update(); return null; }, 0);
}

另一种方法是将Function<String,Void>更改为Consumer<String>,然后您可以使用方法参考:

void update(Collection<String> values, Updater updater) {
    update(values, updater::update, 0);
}
void update(Collection<String> values, Consumer<String> fn, int ignored) {
    // some code
}

答案 1 :(得分:11)

函数返回一个值。您正在寻找的是java.util.function.Consumer界面。这有一个void accept(T)方法,不会返回值。

所以你的方法变成了:

void update(Collection<String> values, Consumer<String> fn, int ignored) {
    // some code
}