Я пытаюсь создать небольшую библиотеку функционального программирования для Java (просто чтобы почесать свой собственный зуд). При определении функций высшего порядка для List
s, Set
s и Map
s я столкнулся с этой проблемой: Функции, которые взять коллекцию, и возвращать коллекцию того же типа имеют почти одинаковую реализацию, и, тем не менее, должны быть переопределены для каждой структуры данных - List
s, Set
s и Map
s.
Например, вот реализация функции map
для List
s и Set
s:
public static List map(
List extends A> xs,
Func1 super A, ? extends B> transformer
) {
List ys = new ArrayList();
for(A a : xs) {
ys.add(transformer.apply(a));
}
return ys;
}
public static Set map(
Set extends A> xs,
Func1 super A, ? extends B> transformer
) {
Set ys = new HashSet();
for(A a : xs) {
ys.add(transformer.apply(a));
}
return ys;
}
A filter
function:
public static List filter(
List extends A> xs,
Func1 super A, Boolean> predicate
) {
List ys = new ArrayList();
for(A a : xs) {
if(predicate.apply(a)) {
ys.add(a);
}
}
return ys;
}
public static Set filter(
Set extends A> xs,
Func1 super A, Boolean> 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);
}