J'essaye de créer une petite bibliothèque de programmation fonctionnelle pour Java (juste pour gratter ma propre démangeaison). Tout en définissant le higher-order functions pours, Set
s et Map
s j'ai rencontré ce problème: Les fonctions qui prennent une collection, et retournent une collection de même type ont presque la même mise en œuvre, et doivent encore être redéfinies pour chacun des structure de données - List
s, Set
s, et Map
s.Suppression de la duplication de code
Par exemple, voici la mise en œuvre de map
fonction pour List
s, et 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;
}
fonction filter
:
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;
}
Comme on peut le voir dans cet exemple, les corps des implémentations pour Set
et List
sont presque les mêmes.
Il y a beaucoup de nombreuses fonctions comme map
et filter
dans ma bibliothèque, et chacun de ceux-ci est défini trois fois pour chaque type de collections que je suis intéressé par (à savoir List
, Set
et Map
). Cela conduit à beaucoup de duplication de code, et l'odeur du code. Je voulais savoir s'il y avait un moyen en Java de m'aider à éviter toute duplication de code.
Toute aide sera grandement appréciée. Merci.
EDIT:
Func1
est une interface définie comme:
interface Func1<A, B> {
public B apply(A a);
}
Il semble que vous pourriez simplement utiliser l'interface 'Collection', pour éliminer les casse séparés pour les interfaces' List' et 'Set'. –
@Bears: Le problème est le suivant: 'map' pour' List' devrait retourner une 'List',' map' pour 'Set' devrait renvoyer' Set' etc. –
Implémentez donc 'Collection' avec' List' ou 'Set' comme argument et appelez cette implémentation depuis vos classes de commodité' List' et 'Set'. – rsp