• 回调函数方式方法完整学习


    回调函数方式方法完整学习

    在Java中,回调机制是一种非常重要的设计模式,它允许我们在不改变代码的情况下增加新的功能。通过回调,我们可以将一些功能代码封装到接口或者函数中,然后在需要的时候再调用它。以下是Java中实现回调的三种方式:接口回调,内部类回调和Lambda表达式回调。

    1. 接口回调:这是Java中最常见的回调方式。我们首先定义一个接口,然后让实现这个接口的类去实现其中的方法。这样,我们就可以将接口类型的引用作为参数传递给一个函数,让这个函数在适当的时候调用接口的方法。

    例如:

    interface Callback {
        void method();
    }
    
    class Caller {
        public void execute(Callback callback) {
            callback.method();
        }
    }
    
    class User implements Callback {
        @Override
        public void method() {
            System.out.println("User's method is called.");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Caller caller = new Caller();
            User user = new User();
            caller.execute(user);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这个例子中,User类实现了Callback接口,并重写了method方法。然后我们创建了一个Caller类,它的execute方法接受一个Callback类型的参数,并在适当的时候调用它的method方法。最后在主函数中,我们创建了一个Caller对象和一个User对象,并将User对象作为参数传递给Caller对象的execute方法。

    1. 内部类回调:在某些情况下,我们可能想要使用内部类来实现回调。内部类可以访问外部类的私有成员,并且可以拥有更丰富的方法。

    例如:

    class OuterClass {
        class InnerClass implements Runnable {
            private OuterClass outerClass;
    
            public InnerClass(OuterClass outerClass) {
                this.outerClass = outerClass;
            }
    
            @Override
            public void run() {
                System.out.println("Inner class's method is called.");
                outerClass.outerMethod();
            }
        }
    
        public void outerMethod() {
            System.out.println("Outer class's method is called.");
        }
    
        public void execute(Runnable runnable) {
            new Thread(runnable).start();
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            OuterClass outerClass = new OuterClass();
            outerClass.execute(outerClass.new InnerClass(outerClass));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这个例子中,InnerClassOuterClass内部类,并且实现了Runnable接口。在InnerClassrun方法中,我们调用了外部类的outerMethod方法。然后我们在主函数中创建了一个OuterClass对象,并调用它的execute方法,将InnerClass对象作为参数传递。新启动的线程会调用InnerClassrun方法,进而调用外部类的outerMethod方法。

    1. Lambda表达式回调:Java 8引入了Lambda表达式,它可以用来简洁地表示匿名函数或方法。使用Lambda表达式,我们可以更方便地实现回调。例如:
    import java.util.function.Consumer;
    
    class LambdaCallbackExample {
        public static void main(String[] args) { 
            performAction(x -> System.out.println("Value: " + x)); // Lambda expression as a callback 
        } 
     
        static void performAction(Consumer<String> callback) { 
            callback.accept("Hello World"); 
        } 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这个例子中,我们使用了Java的Consumer接口来作为回调函数的类型。Lambda表达式 x -> System.out.println("Value: " + x) 就是这个函数的实现。在 performAction 方法中,我们使用了 accept 方法来传递参数并执行回调函数。Lambda表达式的参数 x 在这里被接受并传递给回调函数。这种方式使得代码更加简洁易读。

    以上就是在Java中实现回调的三种主要方式:接口回调、内部类回调和Lambda表达式回调。每种方式都有其适用的场景和优点,需要根据具体的需求来选择使用哪种方式。

    在方法一的基础上还引申出registercallback的回调方法:
    在Java中,可以使用接口(interface)来实现回调。接口定义了一组方法的签名,实现回调时需要编写一个类来实现了这个接口,并将这个类的对象作为参数传递给被回调的函数。

    下面是一个简单的示例:

    // 定义一个回调接口
    interface Callback {
      void onSuccess(String data);
      void onFailure(Exception e);
    }
    
    // 定义一个类,接受回调接口的实例
    class MyClass implements Callback {
      @Override
      public void onSuccess(String data) {
        System.out.println("onSuccess called with data: " + data);
      }
    
      @Override
      public void onFailure(Exception e) {
        System.out.println("onFailure called with exception: " + e.getMessage());
      }
    }
    
    // 定义一个方法,接受回调接口的实例,执行一些操作,并调用回调方法
    public void doSomething(Callback callback) {
      try {
        // 这里做一些操作,例如网络请求,可能会成功或失败
        String result = "result";
        callback.onSuccess(result);
      } catch (Exception e) {
        callback.onFailure(e);
      }
    }
    
    // 在主函数中调用doSomething方法,并传入实现了回调接口的对象
    public static void main(String[] args) {
      MyClass myClass = new MyClass();
      doSomething(myClass);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在这个示例中,我们定义了一个回调接口Callback,它包含了两个方法onSuccessonFailure。然后我们编写了一个类MyClass,它实现了回调接口,并重写了接口中的两个方法。接着我们定义了一个doSomething方法,它接受一个Callback接口的实例作为参数,在方法内部执行一些操作(例如网络请求),并在操作成功或失败时调用回调方法。最后在主函数中,我们创建了一个MyClass的对象,将它作为参数传递给doSomething方法。当doSomething方法调用回调方法时,就会执行MyClass中的相应方法。


    使用registercallback方式进行回调通常是在某些事件或行为发生时,通过注册回调函数来执行相应的操作。具体实现方式可能因编程语言或框架而异,以下是一个通用的示例,以JavaScript为例:

    // 定义一个回调函数
    function myCallbackFunction(data) {
      console.log("回调函数被调用,接收到的数据为:" + data);
    }
    
    // 定义一个注册回调的函数
    function registerCallback(callback) {
      // 这里可以进行一些事件或行为的处理,比如异步请求数据、等待某个事件触发等
      // ...
    
      // 处理完成后,调用回调函数并将结果传递给回调函数
      callback(someData);
    }
    
    // 注册回调函数并传递参数
    registerCallback(myCallbackFunction);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这个示例中,registerCallback函数接受一个回调函数作为参数,并在某些事件或行为完成后调用该回调函数,并将结果(在这里是someData)作为参数传递给回调函数。回调函数myCallbackFunction被注册到registerCallback函数中,因此在registerCallback函数执行完毕后,回调函数会被调用并执行相应的操作。

    这只是一个简单的示例,实际使用中,具体的实现方式可能更加复杂,需要根据具体的编程语言或框架的特性和要求来编写代码。

    再举例

    public class CallbackExample {
        public void calculate(int a, int b, ResultCallback callback) {
            // 这里是计算过程
            int result = a + b;
            // 调用回调方法
            callback.onResult(result);
        }
    
        public interface ResultCallback {
            void onResult(int result);
        }
    
        public static void main(String[] args) {
            CallbackExample example = new CallbackExample();
            example.calculate(2, 3, new ResultCallback() {
                @Override
                public void onResult(int result) {
                    System.out.println("Result: " + result);
                }
            });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    视频剪辑完成,应该如何给视频配音?三种配音方法快来学
    疑似openAI的BUG
    gdb调试时怎样进入C/C++标准库
    Android 13.0 Launcher3中去掉Hotseat功能实现
    Pytorch深度学习实战(1)—— 使用LSTM 自动编码器进行时间序列异常检测
    【Linux】内核同步
    JVM、JRE、JDK
    【TCP/IP】组播
    你的工具包已到货「GitHub 热点速览 v.22.31」
    刷代码随想录有感(118):动态规划——打家劫舍II
  • 原文地址:https://blog.csdn.net/weixin_40553780/article/details/133701130