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, как указано в других ответах.