我正在尝试为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