2013-08-03 34 views
7

Bu, sorunumun komut deseni kullanılarak çözüldüğü başka bir soruyu (Reuse code for looping through multidimensional-array) takip etmektir. Benim problemim, iki boyutlu bir dizinin her elemanı üzerinde işlem yapan çok sayıda yöntemin ve dolayısıyla çok fazla kodun benim olduğumdu. Bunun yerine Komut düzeni lambda ifadeleriyle nasıl değiştirilir?

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

... ben böyle çözülür ... yani gibi birçok yöntemler sahip:

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

biz Java lambda ifadeleri olsaydı Şimdi, bu nasıl kısaltılabilir olabilir? Bu genel olarak nasıl görünüyor? (Kötü İngilizce'm için özür dilerim)

cevap

8

Java 8 lamdas ile basit bir örnek. Bu gibi görünecektir böylece biraz Command sınıf değiştirirseniz: Burada

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

o alt diziden değerini kabul eder. Sonra şöyle bir şey yazabilirsin:

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

Cevabınız için çok teşekkür ederim. "Arrays.stream" -method'un ne yaptığını açıklar mısınız? – subarachnid

+3

Sadece [Akış] (http://lambdadoc.net/api/index.html?java/util/stream/Stream.html) döndürür :) [deneyebilirsiniz] (http://jdk8.java.net/ download.html) kendiniz. – aim

İlgili konular