Ich versuche, eine kleine funktionale Programmierbibliothek für Java zu erstellen (nur um mein eigenes Jucken zu kratzen). Bei der Definition der für List
s, Set
s und Map
s habe ich auf dieses Problem gestoßen: Die Funktionen, die eine Sammlung nehmen und eine Sammlung des gleichen Typs zurückgeben, haben fast die gleiche Implementierung, und müssen für jeden neu definiert werden Datenstruktur - List
s, Set
s und Map
s.Entfernen von Code-Duplizierung
Zum Beispiel, hier ist die Umsetzung der 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 zu sehen sind, der Körper der Implementierungen für Set
und List
sind fast gleich.
Es gibt viele viele Funktionen wie map
und filter
in meiner Bibliothek, und jeder von denen definiert ist dreimal für jede Art von Sammlungen mich interessiert (das heißt List
, Set
und Map
). Dies führt zu viel Code-Duplikation und Code-Geruch. Ich wollte wissen, ob es einen Weg in Java gibt, der mir helfen würde, die gesamte Code-Duplizierung zu vermeiden.
Jede Hilfe wird sehr geschätzt. Vielen Dank.
EDIT:
Func1
ist eine Schnittstelle wie folgt definiert:
interface Func1<A, B> {
public B apply(A a);
}
Es sieht so aus, als könnten Sie einfach die 'Collection'-Schnittstelle verwenden, um separate Fälle für die' List'- und 'Set'-Schnittstellen zu eliminieren. –
@Bears: Das Problem ist das: 'map' für' List' sollte eine 'List' zurückgeben,' map' für 'Set' sollte ein' Set' usw. zurückgeben –
Also implementieren Sie für 'Collection' mit dem' List' oder 'Set' als Argument und rufen Sie diese Implementierung aus Ihren' List' und 'Set' Komfortklassen auf. – rsp