2013-08-03 73 views
7

Đây là loại tiếp theo cho một câu hỏi khác (Reuse code for looping through multidimensional-array) trong đó vấn đề cụ thể của tôi đã được giải quyết bằng cách sử dụng mẫu lệnh. Vấn đề của tôi là, tôi đã có nhiều phương thức thực hiện các phép toán trên mọi phần tử của mảng hai chiều - và do đó có nhiều mã trùng lặp. Thay vì có nhiều phương pháp như vậy ...Làm thế nào để mẫu lệnh có thể được thay thế bằng các biểu thức 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]; 
     } 
    } 
} 

... Tôi giải quyết nó như thế này:

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

Bây giờ nếu chúng ta có biểu thức lambda trong Java, làm thế nào có thể này được rút ngắn? Nó trông như thế nào nói chung? (Xin lỗi vì tiếng Anh kém của tôi)

Trả lời

8

Đây là ví dụ đơn giản với Java 8 lamdas. Nếu bạn thay đổi một lớp Command lớp để nó trông giống như sau:

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

Ở đây nó sẽ chấp nhận giá trị từ mảng phụ. Sau đó, bạn có thể viết một cái gì đó như thế này:

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

Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Bạn có thể giải thích những gì "Arrays.stream" -method không? – subarachnid

+3

Nó chỉ trả về [Stream] (http://lambdadoc.net/api/index.html?java/util/stream/Stream.html) :) Bạn có thể [try] (http://jdk8.java.net/ tự tải xuống). – aim

Các vấn đề liên quan