java – 删除代码重复

前端之家收集整理的这篇文章主要介绍了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练习”.

猜你在找的Java相关文章