Java 8 - как объявить ссылку метода на несвязанный нестатический метод, который возвращает void

Вот простой класс, который иллюстрирует мою проблему:

package com.example;

import java.util.function.*;

public class App {

    public static void main(String[] args) {
        App a1 = new App();

        BiFunction<App, Long, Long> f1 = App::m1;
        BiFunction<App, Long, Void> f2 = App::m2;

        f1.apply(a1, 6L);
        f2.apply(a1, 6L);
    }

    private long m1(long x) {
        return x;
    }

    private void m2(long x) {
    }
}

f1, ссылаясь на App::m1 и связавшись с a1 в f1 вызовом apply, отлично работает - компилятор счастлив, и вызов можно сделать через f1.apply просто отлично,

f2, ссылаясь на App::m2, не работает.

Я хотел бы иметь возможность определить ссылку на метод несвязанного нестатического метода без возвращаемого типа, но я не могу заставить его работать.

Ответ 1

BiFunction представляет собой функцию, которая принимает два аргумента и дает результат.

Я хотел бы иметь возможность определить ссылку метода на несвязанный нестатический метод без возвращаемого типа

используйте BiConsumer вместо этого, который представляет операцию, которая принимает два входных аргумента и не возвращает результат.

BiConsumer<App, Long> f2 = App::m2;

то измените это:

f2.apply(a1, 6L);

:

f2.accept(a1, 6L);

Ответ 2

Ссылка на метод - App:: m2, как и у вас, но не назначается BiFunction, потому что она не возвращает значение, даже значение Void (которое должно быть null). Вам нужно будет сделать:

f2 = (a,b) -> { m2(a,b); return null; }

если вы хотите использовать BiFunction. В качестве альтернативы вы можете использовать BiConsumer, как указано в других ответах.