我正在为
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); }