2013-08-03 16 views
7

これは、別の質問(Reuse code for looping through multidimensional-array)へのフォローアップのようなもので、私の特定の問題がcommand-patternを使って解決されました。私の問題は、2次元配列のすべての要素に対して操作を実行する複数のメソッドがあることです。したがって、重複したコードがたくさんあります。代わりに、そう...コマンドパターンはどのようにラムダ式に置き換えることができますか?

void method() { 
    for (int i = 0; i < foo.length; i++) { 
     for (int j = 0; j < foo[i].length; j++) { 
      // perform specific actions on foo[i][j]; 
     } 
    } 
} 

のような多くの方法があるの...私はこのようにそれを解決:私たちはJavaでラムダ式を持っていた場合

interface Command { 
    void execute(int i, int j); 
} 

void forEach(Command c) { 
    for (int i = 0; i < foo.length; i++) { 
     for (int j = 0; j < foo[i].length; j++) { 
      c.execute(i, j); 
     } 
    } 
} 

void method() { 
    forEach(new Command() { 
     public void execute(int i, int j) { 
      // perform specific actions on foo[i][j]; 
     } 
    }); 
} 

さて、どのようにこれを短縮することができますか?それはどのように一般的に見えるでしょうか? (私の貧しい私の英語には申し訳ありません)

答えて

8

ここでは、Java 8 lamdasの簡単な例を示します。それは次のようになりますので、あなたは少しCommandクラスを変更した場合:ここで

@FunctionalInterface 
    interface Command { 
     void execute(int value); 
    } 

それは、サブ配列から値を受け入れます。そうすれば、次のようなことができます。

int[][] array = ... // init array 
    Command c = value -> { 
     // do some stuff 
    }; 
    Arrays.stream(array).forEach(i -> Arrays.stream(i).forEach(c::execute)); 
+0

ありがとうございました。 "Arrays.stream"メソッドが何をしているのか説明できますか? – subarachnid

+3

それはちょうど[ストリーム](http://lambdadoc.net/api/index.html?java/util/stream/Stream.html)を返します:)あなたは[試すことができます](http://jdk8.java.net/ download.html)をご利用ください。 – aim

関連する問題