6

我对 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);  
    }
}

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

4

4 回答 4

6

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

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);
}
于 2012-06-06T17:27:26.880 回答
5

在 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)
        }
    });
}
于 2012-06-06T17:23:19.973 回答
4

在支持类的帮助下:

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

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

于 2012-06-06T17:23:12.417 回答
0

使用 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);
于 2014-11-06T12:28:03.703 回答