Entfernen von Code-Duplikaten

Ich versuche eine kleine funktionale Programmierbibliothek für Java zu erstellen (nur um meinen eigenen Kratzer zu kratzen). Bei der Definition des Funktionen höherer Ordnung zumLists,Sets undMaps Ich bin auf dieses Problem gestoßen: Die Funktionen, die eine Sammlung annehmen und eine Sammlung desselben Typs zurückgeben, haben fast die gleiche Implementierung und müssen dennoch für jede Datenstruktur neu definiert werden -Lists,Sets undMap s.

Hier ist zum Beispiel die Implementierung vonmap Funktion fürLists undSets:

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;
}

ie aus diesem Beispiel hervorgeht, sind die Stellen der Implementierungen fürSet undList sind fast gleich.

Es gibt viele Funktionen wiemap undfilter in meiner Bibliothek, und jede davon ist dreimal für jeden Sammlungstyp definiert, an dem ich interessiert bin (d. h.List, Set, undMap). Dies führt zu viel Code-Duplikation und Code-Geruch. Ich wollte wissen, ob es in Java einen Weg gibt, der mir hilft, alle Codeduplizierungen zu vermeiden.

Jede Hilfe wird sehr geschätzt. Vielen Dank

BEARBEITEN

Func1 ist eine Schnittstelle definiert als:

interface Func1<A, B> {
  public B apply(A a);
}

Antworten auf die Frage(10)

Ihre Antwort auf die Frage