Ich versuche, eine kleine funktionale Programmierbibliothek für Java zu erstellen (nur um mein eigenes Bedürfnis zu befriedigen). W Funktionen höherer Ordnung für List
s, Set
s und Map
s bin ich auf dieses Problem gestoßen: Die Funktionen, die eine Sammlung nehmen und eine Sammlung desselben Typs zurückgeben, haben fast dieselbe Implementierung und müssen dennoch für jede der Datenstrukturen neu definiert werden - List
s, Set
s, und Map
s.
Hier ist zum Beispiel die Implementierung von map
Funktion für List
s, und 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;
}
A filter
Funktion:
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;
}
Wie aus diesem Beispiel ersichtlich wird, sind die Körper der Implementierungen für Set
y List
sind fast identisch.
Es gibt sehr viele Funktionen wie map
y filter
in meiner Bibliothek, und jede davon ist dreimal für jeden Typ von Sammlungen definiert, an denen ich interessiert bin (d. h. List
, Set
y Map
). Dies führt zu einer Menge Code-Duplikation und Code-Geruch. Ich wollte wissen, ob es eine Möglichkeit in Java gibt, die mir helfen würde, all die Code-Duplikation zu vermeiden.
Für jede Hilfe sind wir dankbar. Danke!
EDITAR:
Func1
ist eine Schnittstelle, die wie folgt definiert ist:
interface Func1<A, B> {
public B apply(A a);
}