我正在嘗試爲Java創建一個小函數編程庫(只是爲了讓我自己癢)。雖然定義higher-order functions爲List
s,Set
s和Map
s我遇到過這個問題:採用集合並返回相同類型集合的函數具有幾乎相同的實現,但必須重新定義每個函數數據結構 - List
s,Set
s和Map
s。刪除代碼重複
例如,這裏是map
功能的List
秒,Set
S中的實現:
public static <A, B> List<B> map(
List<? extends A> xs,
Func1<? super A, ? extends B> transformer
) {
List<B> ys = new ArrayList<B>();
for(A a : xs) {
ys.add(transformer.apply(a));
}
return ys;
}
public static <A, B> Set<B> map(
Set<? extends A> xs,
Func1<? super A, ? extends B> transformer
) {
Set<B> ys = new HashSet<B>();
for(A a : xs) {
ys.add(transformer.apply(a));
}
return ys;
}
一個filter
功能:
public static <A> List<A> filter(
List<? extends A> xs,
Func1<? super A, Boolean> predicate
) {
List<A> ys = new ArrayList<A>();
for(A a : xs) {
if(predicate.apply(a)) {
ys.add(a);
}
}
return ys;
}
public static <A> Set<A> filter(
Set<? extends A> xs,
Func1<? super A, Boolean> predicate
) {
Set<A> ys = new HashSet<A>();
for(A a : xs) {
if(predicate.apply(a)) {
ys.add(a);
}
}
return ys;
}
。從這個例子可以看出,該機構Set
和List
的實現幾乎相同。
有喜歡在我的圖書館map
和filter
很多很多的功能,每一類又被定義三次爲每種類型的收藏我感興趣的(即List
,Set
,並Map
)。這導致了很多代碼重複和代碼異味。我想知道在Java中是否有某種方法可以幫助我避免所有的代碼重複。
任何幫助將不勝感激。謝謝。
編輯:
Func1
是接口定義爲:
interface Func1<A, B> {
public B apply(A a);
}
它看起來像你可以只使用'集合'接口,以消除'List'和'Set'接口的單獨情況。 – 2010-09-14 13:35:23
@熊:問題是這樣的:'List'的map應該返回'List','Set'的'map'應該返回一個'Set'等。 – 2010-09-14 13:45:07
因此,以'List'或'Set'作爲參數實現'Collection',並從'List'和'Set'方便類中調用該實現。 – rsp 2010-09-14 13:53:55