【问题标题】:How to call function with callbacks in Java like I do it in C#?如何像在 C# 中那样在 Java 中使用回调调用函数?
【发布时间】:2012-06-10 18:01:17
【问题描述】:

我对 Java 还很陌生,但我需要编写类似这样的 C# 代码(这是手工键入的原型,只是为了说明我需要什么)

private void ParentFunc()
{
    var worker = new WorkerClass()

    worker.DoWork(e => console.Write("Progress" + e));


}

public class WorkerClass()
{
    public method DoWork(Action<int> callback)
    {
        for (int i=1; i<1000; i++) callback.Invoke(i);  
    }
}

一点解释。我在 android 中使用AsyncTask 并调用外部处理器分类但希望他们发回信号以便我可以publishProgress。我不想把接口放在我的AsyncTask

【问题讨论】:

标签: c# java android delegates


【解决方案1】:

使用 java 8 是可能的。请参阅我对重复问题的回答:

https://stackoverflow.com/a/26776520/1206998

使用函数作为参数:

import java.util.function.Function;

public String applyFunction(Function<String,String> function){
        return function.apply("what ever");
}

打电话

// with someObject.someMethod(String) => String
xxx.applyFunction(someObject::someMethod);

【讨论】:

    【解决方案2】:

    在 java 中,您使用实现接口的匿名类。这有点冗长,但它工作得很好:

    interface MyAction {
        void doit(String str);
    }
    
    class WorkerClass {
        void doWork(MyAction action);
    }
    
    void main(String args[]) {
        WorkerClass worker = new WorkerClass();
        worker.doWork(new MyAction {
            public void doit(String e) {
                System.out.println("Progress" + e)
            }
        });
    }
    

    【讨论】:

    • @Eng.Fouad 哎呀,我用 C# 编码太久了 :) 谢谢!
    【解决方案3】:

    借助支持类:

    interface CallBack<P>
    {
      public void callback(P p);
    }
    
    class MyCallBack implements CallBack<String> {
      public void callBack(String p) {
        System.out.println(p);
      }
    }
    
    class WorkerClass {
      public void doWork(CallBack<String> callback)
      {
        // do work
        callback.callBack("Done!");
      }
    }
    
    WorkerClass wc = new WorkerClass();
    wc.doWork(new MyCallBack());
    

    我不建议您使用匿名类,因为我发现它们非常冗长,直到无法使用更简洁的语法,但这只是个人喜好问题,当我使用时,我最终会在大括号之间迷失自我他们..

    【讨论】:

      【解决方案4】:

      由于还不支持闭包,您必须使用接口和匿名内部类。

      private void ParentFunc {
          WorkerClass worker = new WorkerClass();
      
          worker.doWork(new Callback<Integer>() {
              public void invoke(Integer arg) {
                  System.out.println("Progress" + arg);
              }
          });
      }
      
      public class WorkerClass {
          public doWork(Callback<Integer> callback) {
              for (int i=1; i<1000; i++) callback.invoke(i);  
          }
      }
      
      public interface Callback<T> {
          public void invoke(T arg);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 2014-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多