Estoy intentando crear una pequeña biblioteca de programación funcional para Java (solo para borrar mi propio picor). Mientras defino el higher-order functions para List
s, Set
sy Map
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 aún tienen que redefinirse para cada una de las estructura de datos - List
s, Set
s, y Map
s.Eliminar la duplicación de código
Por ejemplo, aquí es la implementación de map
función para List
s, y Set
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;
}
Un filter
de 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 puede verse en este ejemplo, los cuerpos de las implementaciones para Set
y List
son casi las mismas.
Hay muchas muchas funciones como map
y filter
en mi biblioteca, y cada uno de los tres veces se define para cada tipo de colecciones Me interesa (es decir List
, Set
y Map
). Esto conduce a una gran cantidad de duplicación de código y código de olor. Quería saber si hay alguna forma en Java que me ayude a evitar toda la duplicación de código.
Cualquier ayuda será muy apreciada. Gracias.
EDIT:
Func1
es una interfaz define como:
interface Func1<A, B> {
public B apply(A a);
}
Parece que podría usar la interfaz 'Colección', para eliminar casos separados para las interfaces' List' y 'Set'. –
@Bears: El problema es este: 'map' for' List' debería devolver 'List',' map' for 'Set' debería devolver' Set', etc. –
Implementa para 'Collection' con' List' o 'Set' como argumento y llama a esa implementación desde tus clases de conveniencia' List' y 'Set'. – rsp