2014-04-21 15 views
8

tôi có mã trông như thế này:sạch mã - cách tốt nhất để mã nhỏ gọn trong Java

for(int i=0; i < a; i++){ 
     List<Integer> list = elementA.get(i); 
     SomeClass rg = new SomeClass(list, a, methodA(i)); 
     int result = rg.generate(); 
     var+=methodA2(i, result); 
    } 
    for(int i=0; i < b; i++){ 
     List<Integer> list = elementB.get(i); 
     SomeClass rg = new SomeClass(list, b, methodB(i)); 
     int result = rg.generate(); 
     var+=methodB2(i, result); 
    } 

Làm thế nào tôi có thể tránh mã lặp lại này? Tôi có thể tạo ra chức năng mà làm điều đó, nhưng phải làm gì với các phương pháp khác nhau này?

+0

Nó phụ thuộc vào tờ khai của elementA và elementB, của methodA() và methodB(), và của methodA2() và methodB2(). Nếu các phương thức get() của các lớp được định nghĩa bởi một giao diện chung hoặc siêu lớp, nó sẽ giúp. Đối với các phương pháp, chúng ta chỉ cần biết thêm về chúng - chúng có tương ứng với các lớp với get() trong một số thời trang không? – arcy

Trả lời

10

Với Java < 8 bạn có thể tạo một giao diện (lưu ý rằng có đã là một giao diện IntFunction trong Java 8):

interface IntFunction<A> { A apply (int i); } 

m(elementA, a, new IntFunction<A>() { public A apply(int i) { methodA(i); } }); 

Và phương pháp của bạn sẽ trông như thế:

private void m(Collection<List<Integer>> element, int a, IntFunction<A> f) { 
    for(int i=0; i < a; i++){ 
     List<Integer> list = element.get(i); 
     SomeClass rg = new SomeClass(list, a, f.apply(i)); 
     int result = rg.generate(); 
    } 
} 

(Tôi đã bỏ qua số methodA2 cho sự đồng nhất: bạn sẽ cần một giao diện thứ hai có apply(int, int))

Đó là khá rbose và lợi ích không rõ ràng so với sự lặp lại.


Với Java 8 nó trở nên sạch hơn:

m(elementA, a, i -> methodA(i)); 
//or 
m(elementA, a, this::methodA); 
+1

@ ᴋᴇʏsᴇʀ Tôi đã thêm một ví dụ chi tiết hơn. – assylias

+1

Có thể đáng để chỉ ra rằng giao diện 'IntFunction' [đã tồn tại trong Java 8] (http://docs.oracle.com/javase/8/docs/api/java/util/function/IntFunction.html). –

+0

@BoristheSpider Có, tôi đã chọn tên đúng mục đích! – assylias

1
  • Xác định một phương pháp mà nhận của bạn List<List<Integer>> như lập luận rằng trả về dữ liệu mong muốn.
  • Xác định giao diện sẽ giữ các phương thức chung như method, method2 (dựa trên mã của bạn).

Ví dụ:

public long yourFooMethod(List<List<Integer>> listOfData, int n, SomeInterface foo) { 
    int i = 0; 
    long var = 0; 
    for(List<Integer> list : listOfData) { 
     SomeClass rg = new SomeClass(list, n, foo.method(i)); 
     int result = rg.generate(); 
     var += foo.method2(i, result); 
    } 
    return var; 
} 
Các vấn đề liên quan