Удаление дублирования кода

Я пытаюсь создать небольшую библиотеку функционального программирования для Java (просто чтобы почесать свой собственный зуд). При определении функций высшего порядка для List s, Set s и Map s я столкнулся с этой проблемой: Функции, которые взять коллекцию, и возвращать коллекцию того же типа имеют почти одинаковую реализацию, и, тем не менее, должны быть переопределены для каждой структуры данных - List s, Set s и Map s.

Например, вот реализация функции map для List s и Set s:

public static  List map(
  List xs, 
  Func1 transformer
) {
  List ys = new ArrayList();
  for(A a : xs) {
    ys.add(transformer.apply(a));
  }
  return ys;
}

public static  Set map(
  Set xs, 
  Func1 transformer
) {
  Set ys = new HashSet();
  for(A a : xs) {
    ys.add(transformer.apply(a));
  }
  return ys;
}

A filter function:

public static  List filter(
  List xs, 
  Func1 predicate
) {
  List ys = new ArrayList();
  for(A a : xs) {
    if(predicate.apply(a)) {
      ys.add(a);
    }
  }
  return ys;
}

public static  Set filter(
  Set xs, 
  Func1 predicate
) {
  Set ys = new HashSet();
  for(A a : xs) {
    if(predicate.apply(a)) {
      ys.add(a);
    }
  }
  return ys;
}

Как видно из этого примера, тела реализаций для Set и List почти одинаковы.

Их очень много. такие функции, как map и filter в моей библиотеке, и каждая из них определяется трижды для каждого типа коллекций, которые меня интересуют (например, List , Установите и Карта ). Это приводит к большому дублированию кода, и запах кода. Я хотел знать, есть ли в Java способ, который поможет мне избежать дублирования кода.

Любая помощь будет принята с благодарностью. Спасибо.

РЕДАКТИРОВАТЬ:

Func1 - это интерфейс, определенный как:

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

9
задан Dalmas 30 June 2012 в 12:14
поделиться