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アンドロイドで使用しており、クラス化された外部プロセッサを呼び出していますが、できるようにシグナルを送りたい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 に答える