Я пытаюсь создать небольшую функциональную библиотеку программирования для Java (просто чтобы поцарапать свой собственный зуд). Определяя higher-order functions для List
s, Set
s и Map
s Я столкнулся с этой проблемой: функции, которые берут коллекцию и возвращают коллекцию того же типа, имеют почти одну и ту же реализацию и все же должны быть переопределены для каждого из структура данных - List
s, Set
s, и Map
s.Удаление дублирования кода
Например, вот реализация map
функции для List
с, и Set
с:
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;
}
filter
функция:
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;
}
Как видно из этого примера, органы реализаций для Set
и List
почти одинаковы.
Есть много много функций, как map
и filter
в моей библиотеке, и каждый из них определяются трижды для каждого типа коллекций я заинтересован (т.е. List
, Set
и Map
). Это приводит к большому дублированию кода и запаху кода. Я хотел знать, есть ли какой-то способ в Java, который поможет мне избежать дублирования кода.
Любая помощь будет принята с благодарностью. Благодарю.
EDIT:
Func1
представляет собой интерфейс определяется как:
interface Func1<A, B> {
public B apply(A a);
}
Похоже, вы можете просто использовать интерфейс 'Collection', чтобы исключить отдельные случаи для интерфейсов' List' и 'Set'. –
@Bears: Проблема заключается в следующем: 'map' для' List' должен возвращать 'List',' map' для 'Set' должен возвращать' Set' и т. Д. –
Итак, реализуйте для 'Collection' с аргументом' List' или 'Set' as и вызывайте эту реализацию из ваших классов класса List и' Set'. – rsp