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, не работает.

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


person John Calcote    schedule 07.10.2017    source источник
comment
Очередная жертва void != Void :)   -  person Dariusz    schedule 10.10.2017


Ответы (2)


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

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

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

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

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

f2.apply(a1, 6L);

к этому:

f2.accept(a1, 6L);
person Ousmane D.    schedule 07.10.2017

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

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

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

person Joshua Taylor    schedule 07.10.2017