Невозможно преобразовать void в java.lang.Void

Я пытаюсь сделать следующее

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.

Как решить эту проблему?

Ответы

Ответ 1

A 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
}

Ответ 2

Функция возвращает значение. То, что вы ищете, это интерфейс java.util.function.Consumer. Это имеет метод void accept(T) и не возвращает значение.

Итак, вы получаете метод:

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