java – 删除代码重复

我正在为 Java创建一个小功能的编程库(只是为了划破我自己的痒).在为列表,集合和映射定义 higher-order functions时,我遇到了这个问题:采集集合并返回相同类型的集合的函数具有几乎相同的实现,但是必须为每个数据结构重新定义 – 列表,集合和地图.

例如,这里是列表和集合的地图函数的实现:

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,? extends B> transformer
) {
  Set<B> ys = new HashSet<B>();
  for(A a : xs) {
    ys.add(transformer.apply(a));
  }
  return ys;
}

过滤功能

public static <A> List<A> filter(
  List<? extends A> xs,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,Boolean> predicate
) {
  Set<A> ys = new HashSet<A>();
  for(A a : xs) {
    if(predicate.apply(a)) {
      ys.add(a);
    }
  }
  return ys;
}

从该示例可以看出,Set和List的实现的主体几乎相同.

在我的图书馆中有很多功能,如地图和过滤器,并且每个类型都定义了我感兴趣的每种类型的集合(即列表,集合和映射)三倍.这导致了很多代码重复,并且代码气味.我想知道Java中是否有一些方法可以帮助我避免所有的代码重复.

任何帮助将不胜感激.谢谢.

编辑:

Func1是一个接口,定义如下:

interface Func1<A,B> {
  public B apply(A a);
}

解决方法

Java不具有高阶多态(也称较高类),因此在类型系统中是不可能的.许多Java程序员诉诸于XML和/或反射(即逃避类型系统)来解决这种不足之处.

Scala可以处理这个,你所描述的被称为协变函数.这个相当基础的数据类型(以及更多的)已经在Scalaz库中实现,包括java.util.*的实现.

此外,还有更多的协变函数不是集合,更多的函数不是协变的.

如果您想进一步探索这个特定的概念,您可能希望google为“20中级Scala练习”.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...