Eliminar la duplicación de código

Estoy tratando de crear una pequeña biblioteca de programación funcional para Java (solo para rascar mi propio picor). Mientras define elfunciones de orden superior paraLists,Sets yMaps 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, sin embargo, deben redefinirse para cada estructura de datos:Lists,Sets, yMaps.

Por ejemplo, aquí está la implementación demap función paraLists, ySets:

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 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 se puede ver en este ejemplo, los cuerpos de las implementaciones paraSet yList son casi lo mismo

Hay muchas funciones comomap yfilter en mi biblioteca, y cada una de ellas se define tres veces para cada tipo de colecciones que me interesan (es decir,List, SetyMap) Esto conduce a una gran cantidad de duplicación de código y olor a código. Quería saber si hay alguna forma en Java que me ayudaría a evitar toda la duplicación de código.

Cualquier ayuda será apreciada. Gracias.

EDITAR:

Func1 es una interfaz definida como:

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

Respuestas a la pregunta(5)

Su respuesta a la pregunta