【发布时间】:2011-04-12 04:17:08
【问题描述】:
我正在尝试为 Java 创建一个小的函数式编程库(只是为了解决我自己的痒)。在为Lists、Sets 和Maps 定义higher-order functions 时,我遇到了这个问题:接受集合并返回相同类型集合的函数具有几乎相同的实现,但是必须为每个数据结构重新定义 - Lists、Sets 和 Maps。
例如这里是map函数对Lists和Sets的实现:
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);
}
【问题讨论】:
-
看起来您可以只使用
Collection接口,以消除List和Set接口的不同情况。 -
@Bears:问题是这样的:
mapforList应该返回List,mapforSet应该返回Set等等。 -
因此,使用
List或Set作为参数实现Collection,并从List和Set便利类中调用该实现。
标签: java generics programming-languages functional-programming