Давайте подробно рассмотрим Function:
Interface Function<T,R> {
default <V> Function<T,V> andThen(Function<? super R,? extends V> after){}
R apply(T t);
default <V> Function<V,R> compose(Function<? super V,? extends T> before){}
static <T> Function<T,T> identity();
}
обратите внимание на R apply(T t);
применяет эту функцию к данному аргументу.
Function<Void, Integer> function = Void::?????;
Void voidInstance = null;
function.apply(voidInstance);
Это не имеет смысла. Вы хотите передать Пустоту так, чтобы функция Пустоты применялась?
Несколько наглядных примеров того, что компилируется как функция
обратите внимание, что c->c.getMaxSpeed()
и Car::getMaxSpeed
синтаксически эквивалентны, если метод является instanceMethod. Для нестатических методов первый аргумент выводится из типа, метод которого используется, и должен быть предоставлен позже (как экземпляр, к которому метод будет выполняться/применяться).
public class Car {
private int maxSpeed;
public Car(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public int getMaxSpeed() {
return this.maxSpeed;
}
public Void setMaxSpeed() {
this.maxSpeed = 12;
return null;
}
public static int intStaticFunction(Void v) {
return new Random().nextInt();
}
public static Void voidStaticFunction(Void v) {
return null;
}
public static void main(String[] args) {
final Car carX = new Car(155);
final Car carY = new Car(140);
final List<Car> cars = new ArrayList<>();
cars.add(carX);
cars.add(carY);
cars.sort(Comparator.comparing(Car::getMaxSpeed));
final Function<Car, Integer> function1 = c->c.getMaxSpeed();
final Function<Car, Integer> function2 = Car::getMaxSpeed;
final Function<Car, Void> function3 = Car::setMaxSpeed;
final Function<Void, Void> function4 = n->n;
final Function<Void, Integer> function5 = n->5;
final Function<Void, Integer> function6 = Car::intStaticFunction;
final Function<Void, Void> function7 = Car::voidStaticFunction;
final Function<Car, Integer> function8 = function1::apply;
final Function<Car, Integer> function9 = function2::apply;
System.out.println(function1.apply(carX));
System.out.println(function2.apply(carX));
System.out.println(function8.apply(carX));
System.out.println(function9.apply(carX));
System.out.println(function3.apply(carX));
System.out.println(function1.apply(carX));
System.out.println(function2.apply(carX));
System.out.println(function8.apply(carX));
System.out.println(function9.apply(carX));
System.out.println();
System.out.println(function4.apply(null));
System.out.println(function5.apply(null));
System.out.println(function6.apply(null));
System.out.println(function7.apply(null));
}
}
person
HopefullyHelpful
schedule
03.06.2016
Cannot resolve method
. Я пробовал оба: Car::getMaxSpeed и carX::getMaxSpeed. - person saravana_pc   schedule 03.06.2016Comparator.comparingInt
, чтобы избежать бокса. - person Tunaki   schedule 03.06.2016carX::getMaxSpeed
, который сильно отличается отCar::getMaxSpeed
. Большинство ответов говорят о первой версии, а не обо всех. Это сбивает с толку: ваше редактирование сделало недействительной часть ответов... - person Tunaki   schedule 03.06.2016Void
, то есть ожидать экземплярjava.lang.Void
, но вы вряд ли когда-нибудь увидите там что-то отличное отnull
, так что это не очень полезно. Дело в том, чтоVoid
не является оболочкой дляvoid
, это всего лишь заполнитель дляVoid.TYPE
, который содержит объектClass
, представляющийvoid.class
. - person Holger   schedule 03.06.2016