2013-08-03 5 views
7

यह एक अन्य प्रश्न (Reuse code for looping through multidimensional-array) का अनुवर्ती प्रकार है जहां कमांड-पैटर्न का उपयोग कर मेरी विशिष्ट समस्या का समाधान किया गया था। मेरी समस्या यह थी कि मेरे पास दो-आयामी सरणी के प्रत्येक तत्व पर संचालन करने के कई तरीके थे - और इसलिए बहुत सारे डुप्लिकेट कोड। इसके बजाय तो जैसे कई तरीकों होने के ...कमांड पैटर्न को लैम्ब्डा एक्सप्रेशन द्वारा कैसे बदला जा सकता है?

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

... मैं इसे इस तरह हल:

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

जावा 8 लैमडास के साथ यहां सरल उदाहरण। आप थोड़ा 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" -method क्या करता है? – subarachnid

+3

यह सिर्फ [स्ट्रीम] लौटाता है (http://lambdadoc.net/api/index.html?java/util/stream/Stream.html) :) आप [कोशिश कर सकते हैं] (http://jdk8.java.net/ download.html) स्वयं। – aim

संबंधित मुद्दे