Java接口和回调方法

时间:2016-12-22 03:17:29

标签: java

任何人都可以解释这段代码背后的概念吗?我不知道要搜索什么或从哪里开始?我想更多关于这种类型的编程。

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
}

由于

2 个答案:

答案 0 :(得分:2)

从Java 8开始,具有一个非默认方法的接口可以表示为lambda-expressions。这些接口也称为功能接口。

您的代码创建了两个接口A的实例作为lambda表达式,它们被实现为方法methodOnemethodTwo的适配器。

基本上这是一种更紧凑的写作方式

...

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_Amethod_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);