Ваш код может фактически быть simplfied к этому:
private static interface A {
void apply(String name, int i, int j);
}
private final A method_A = this::methodOne;
private final A method_B = this::methodTwo;
public void methodOne(String name, int i, int j){
// do something
}
public void methodTwo(String name, int i, int j){
// do some other thing
}
Две переменные method_A
и method_B
только регулярные переменные, которые имеют тип A
. Реальная особенность в этом - это значение, которое вы назначаете переменным - this::methodOne
.
Я предполагаю, что у вас есть некоторые знания о классах и интерфейсах и о том, как работают их экземпляры. Если нет, сначала изучите эти вещи.
A
имеет только один метод, поэтому вы можете рассматривать его как тип, который «хранит» метод. Я объясню, почему.
До Java 8, можно было бы написать что-то вроде этого:
private final A method_A = new A() {
@Override
public void apply(String name, int i, int j) {
EnclosingClass.this.methodOne(name, i, j);
}
};
Вы создать анонимный класс, который имеет только метод apply
. Видеть? Разве объект method_A
не хранит ничего, кроме реализации метода?
Поскольку Java 8, вы можете вместо этого написать этот лямбда-выражение:
private final A method_A = this::methodOne;
Как вы можете догадаться, к настоящему времени, все это синтаксический сахар. Вы в основном говорите, что method_A
будет хранить methdOne
. Затем вы можете пройти method_A
, и вы фактически передаете реализацию метода!
Новый поток API использует это и позволяет делать такие вещи, как:
someList.stream().forEach(System.out::println);
Благодарим вас за объяснение. Яркая комбинация интересна! – theeminence
@theeminence Если вы считаете, что ответ отвечает на ваш вопрос, подумайте о том, чтобы принять его, нажав на галочку. – Sweeper
Я принял ваш ответ – theeminence