Eliminar la duplicación de código
Estoy tratando de crear una pequeña biblioteca de programación funcional para Java (solo para rascar mi propio picor). Mientras define elfunciones de orden superior paraList
s,Set
s yMap
s Me he encontrado con este problema: las funciones que toman una colección y devuelven una colección del mismo tipo tienen casi la misma implementación y, sin embargo, deben redefinirse para cada estructura de datos:List
s,Set
s, yMap
s.
Por ejemplo, aquí está la implementación demap
función paraList
s, ySet
s:
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;
}
A filter
función:
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;
}
Como se puede ver en este ejemplo, los cuerpos de las implementaciones paraSet
yList
son casi lo mismo
Hay muchas funciones comomap
yfilter
en mi biblioteca, y cada una de ellas se define tres veces para cada tipo de colecciones que me interesan (es decir,List
, Set
yMap
) Esto conduce a una gran cantidad de duplicación de código y olor a código. Quería saber si hay alguna forma en Java que me ayudaría a evitar toda la duplicación de código.
Cualquier ayuda será apreciada. Gracias.
EDITAR:
Func1
es una interfaz definida como:
interface Func1<A, B> {
public B apply(A a);
}