2013-08-03 2 views
7

Dies ist eine Art Follow-up zu einer anderen Frage (Reuse code for looping through multidimensional-array), in der mein spezifisches Problem gelöst wurde, indem das Befehlsmuster verwendet wurde. Mein Problem war, dass ich mehrere Methoden hatte, Operationen für jedes Element eines zweidimensionalen Arrays auszuführen - und daher viel doppelten Code. Stattdessen viele Methoden, wie so von mit ...Wie könnte das Befehlsmuster durch Lambda-Ausdrücke ersetzt werden?

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

... ich es so gelöst:

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

Wenn wir nun Lambda-Ausdrücke in Java haben, wie dies verkürzt werden könnte? Wie würde das im Allgemeinen aussehen? (Sorry für mein schlechtes Englisch)

Antwort

8

Hier einfaches Beispiel mit Java 8 Lamdas. Wenn Sie ein bisschen Command Klasse ändern, damit es wie folgt aussehen:

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

Hier wird Wert von Subarray akzeptieren. Dann könntest du so etwas schreiben:

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

Vielen Dank für Ihre Antwort. Kannst du erklären, was die "Arrays.stream" -Methode tut? – subarachnid

+3

Es gibt nur [Stream] (http://lambdadoc.net/api/index.html?java/util/stream/Stream.html) :) Sie können [versuchen] (http://jdk8.java.net/ download.html) selbst. – aim

Verwandte Themen