O ile mi wiadomo, nie ma wbudowanych funkcji bezpośrednio realizujących to zadanie. Ponieważ nie można uniknąć tworzenia metod użytkowych (jeśli chcesz ograniczyć powielanie kodu), warto zastanowić się, jaki rodzaj narzędzia może być użyteczny również w innych sytuacjach.
E.g. gdyby to był mój projekt Wiedziałem, że prawie zawsze są sposoby częściowego zastosowania funkcji latające dookoła, jak:
public static <T,U,R> Function<U,R> bind(BiFunction<T,U,R> f, T t) {
return u -> f.apply(t, u);
}
Wykorzystując tę istniejącą metodę, to rozwiązanie może wyglądać tak:
static <T> boolean contains(List<T> list, T item, Comparator<? super T> comparator) {
return list.stream().map(bind(comparator::compare, item))
.anyMatch(Predicate.isEqual(0));
}
Ale to nie jest koniecznie najlepsze rozwiązanie.
Innym rozwiązaniem mogłoby być dysponowanie sposobem do konwersji Comparator
na równi BiPredicate
i sposób użytkowego do częściowego stosowania BiPredicate
:
public static <T> BiPredicate<T,T> match(Comparator<T> f) {
return (a,b)->f.compare(a, b)==0;
}
public static <T,U> Predicate<U> bind(BiPredicate<T,U> f, T t) {
return u -> f.test(t, u);
}
wówczas sposób contains
staje się tak łatwe, jak
static <T> boolean contains(List<T> list, T item, Comparator<? super T> comparator) {
return list.stream().anyMatch(bind(match(comparator), item));
}
Jest to jednak tylko uproszczenie, jeśli metody użytkowe można wykorzystać również w innych miejscach projektu. Z drugiej strony mają one ogólny charakter, że podobne metody mogą zostać dodane jako metody do interfejsów funkcji w kolejnej wersji Java. W takim przypadku Twój kod wykorzystujący takie metody narzędziowe jest przygotowany do migracji do nowszej wersji.
Cóż, czy kod, który piszesz, nie zadowala? Wygląda dobrze (chociaż w podpisie dostarczyłbym 'Komparator super T>' zamiast) – fge
Mam wrażenie, że można go poprawić dzięki inteligentnemu wykorzystaniu platformy lub języka. – ymajoros
używanie strumieni z własnymi komparatorami jest prawie tym, co większość ludzi nazwałaby "inteligentnym wykorzystaniem frameworka". To także najbardziej "ładny" sposób z powodu lambda. Czego chcieć więcej? – specializt