任何人都可以解释这段代码背后的概念吗?我不知道要搜索什么或从哪里开始?我想更多关于这种类型的编程。
private static interface A {
void apply(String name, int i, int j);
}
private final A method_A = (name, i, j) -> methodOne(name, i, j);
private final A method_B = (name, i, j) -> methodTwo(name, i, j);
public void methodOne(String name, int i, int j){
// do something
}
public void methodTwo(String name, int i, int j){
// do some other thing
}
由于
答案 0 :(得分:2)
从Java 8开始,具有一个非默认方法的接口可以表示为lambda-expressions。这些接口也称为功能接口。
您的代码创建了两个接口A
的实例作为lambda表达式,它们被实现为方法methodOne
和methodTwo
的适配器。
基本上这是一种更紧凑的写作方式
...
private final A method_A = new A{
public void apply(String name, int i, int j){
methodOne(name, i, j);
}
};
private final A method_B = new A{
public void apply(String name, int i, int j){
methodOne(name, i, j);
}
};
...
答案 1 :(得分:1)
您的代码实际上可以简化为:
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开始,您可以编写此 lambda表达式:
private final A method_A = this::methodOne;
正如你现在可能猜到的那样,它是所有语法糖。您基本上是说method_A
将存储methdOne
。然后你可以传递method_A
,你实际上正在传递方法的实现!
新的流API利用了这一点,让您可以执行以下操作:
someList.stream().forEach(System.out::println);