java – 删除代码重复
发布时间:2020-12-14 05:16:55 所属栏目:Java 来源:网络整理
导读:我正在为 Java创建一个小功能的编程库(只是为了划破我自己的痒).在为列表,集合和映射定义 higher-order functions时,我遇到了这个问题:采集集合并返回相同类型的集合的函数具有几乎相同的实现,但是必须为每个数据结构重新定义 – 列表,集合和地图. 例如,这
我正在为
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练习”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |