2014-04-21 147 views
8

緊湊的代碼最好的方法我有一些代碼,看起來像這樣:乾淨的代碼 - 在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); 
    } 

我怎樣才能避免這種重複的代碼?我可以創建這樣做的函數,但如何處理這種不同的方法?

+0

這取決於elementA和elementB,的了methodA()和的methodB()的聲明,和methodA2()和methodB2的()。如果類的get()方法是由一個通用接口或超類定義的,那麼這會有所幫助。至於方法,我們只需要更多地瞭解它們 - 它們是否以某種方式與get()類相對應? – arcy

回答

10

與Java < 8,你可以創建一個接口(注意,已經是Java 8的IntFunction接口):

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

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

和你的方法是這樣的:

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

(我爲簡潔起見,省略了methodA2:您將需要第二個接口,其具有apply(int, int)

這相當於ve與重複相比,好處並不明顯。


在Java 8變得清潔器:

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

@ᴋᴇʏsᴇʀ我已經添加了一個更詳細的例子。 – assylias

+1

值得指出的是'IntFunction'接口[已經存在於Java 8中](http://docs.oracle.com/javase/8/docs/api/java/util/function/IntFunction.html)。 –

+0

@BoristheSpider是的,我沒有故意選擇這個名字! – assylias

1
  • 定義接收您List<List<Integer>>作爲參數,返回所希望的數據的方法。
  • 定義一個接口,該接口將保存通用方法,如method,method2(基於您的代碼)。

例如:

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