2013-08-03 11 views
7

Jest to swego rodzaju kontynuacja innego pytania (Reuse code for looping through multidimensional-array), w którym mój konkretny problem został rozwiązany za pomocą wzorca polecenia. Mój problem polegał na tym, że miałem wiele metod wykonywania operacji na każdym elemencie dwuwymiarowej tablicy - a zatem wiele duplikatów kodu. Zamiast wielu metod, takich jak tak ...W jaki sposób wzór polecenia można zastąpić wyrażeniami lambda?

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]; 
     } 
    } 
} 

... Rozwiązałem to tak:

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]; 
     } 
    }); 
} 

Teraz gdybyśmy mieli wyrażeń lambda w Java, jak to może być skrócona? Jak by to wyglądało w ogóle? (Przepraszam za mój słaby angielski)

Odpowiedz

8

Oto prosty przykład z Java 8 lamdas. Jeśli zmieni się nieco Command klasę tak będzie wyglądać następująco:

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

Tutaj będzie przyjmować wartość z sub tablicy. Następnie możesz napisać coś takiego:

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

Dziękuję bardzo za odpowiedź. Czy możesz wyjaśnić, co robi metoda "Arrays.stream"? – subarachnid

+3

Po prostu zwraca [Stream] (http://lambdadoc.net/api/index.html?java/util/stream/Stream.html) :) Możesz [spróbować] (http://jdk8.java.net/ download.html) siebie. – aim