Próbuję utworzyć małą funkcjonalną bibliotekę programowania dla Javy (tylko po to, aby zadrapać własną swędzenie). Podczas definiowania higher-order functions dla,S i, s natknąłem się na ten problem: Funkcje, które pobierają kolekcję i zwracają kolekcję tego samego typu, mają prawie taką samą implementację, a jednak muszą zostać przedefiniowane dla każdego z nich. struktura danych - List
s, Set
s oraz Map
s.Usuwanie powielania kodu
Na przykład tutaj jest wdrożenie map
funkcji dla List
S i Set
s:
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
funkcyjne:
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;
}
Jak widać z tego przykładu, organy implementacji dla Set
i List
są prawie takie same.
Istnieje wiele wiele funkcji, takich jak map
i filter
w mojej bibliotece, a każdy z nich jest zdefiniowany trzykrotnie dla każdego typu zbiorów Jestem zainteresowany (tj List
, Set
i Map
). Prowadzi to do wielu powielania kodu i zapachu kodu. Chciałem wiedzieć, czy jest jakiś sposób w Javie, który pomógłby mi uniknąć duplikacji kodu.
Każda pomoc zostanie bardzo doceniona. Dzięki.
EDIT:
Func1
jest interfejsem zdefiniowane jako:
interface Func1<A, B> {
public B apply(A a);
}
Wygląda na to, że możesz po prostu użyć interfejsu 'Collection', aby wyeliminować oddzielne przypadki dla interfejsów' List' i 'Set'. –
@Bears: Problem jest następujący: 'map' dla' List' powinien zwrócić 'List',' map' dla 'Set' powinien zwrócić' Set' itp. –
Zatem zaimplementuj dla 'Collection' z argumentem' List' lub 'Set' as i wywołaj tę implementację z klas wygody' List' i 'Set'. – rsp