有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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
}

谢谢


共 (1) 个答案

  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,你实际上是在传递一个方法的实现

    新的stream API利用了这一点,并允许您执行以下操作:

    someList.stream().forEach(System.out::println);