Omówienie interfejsu BiPredicate #6
Interfejs BiPredicate
realizuje te same zadania co Predicate
opisany w poprzedniej części. Różnica jest taka, że tym razem możemy przekazać do niego 2 argumenty i wykonać na nich operację logiczną. Zobaczmy, jak wygląda zatem BiPredicate<T,U>
, zaskoczenia nie będzie, ale warto poćwiczyć.
@FunctionalInterface
interface BiPredicate<T, U> {
/**
* Testuje argumenty i zwraca wartość boolean
*/
boolean test(T t, U u);
/**
* Sprawdza warunki wyrażeniem logicznym AND
*/
default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U> other) {
Objects.requireNonNull(other);
return (T t, U u) -> test(t, u) && other.test(t, u);
}
/**
* Sprawdza warunek i zwraca jego zaprzeczenie
*/
default java.util.function.BiPredicate<T, U> negate() {
return (T t, U u) -> !test(t, u);
}
/**
* Sprawdza warunki wyrażeniem logicznym OR
*/
default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U> other) {
Objects.requireNonNull(other);
return (T t, U u) -> test(t, u) || other.test(t, u);
}
}
Powołuję dwa obiekty Book
i tworzę wyrażenie lambda, które będzie sprawdzać czy cena pierwszej książki jest większa niż drugiej.
Book book1 = new Book(39.99, "twarda");
Book book2 = new Book(29.99, "twarda");
BiPredicate<Book, Book> isMoreExpensive = (bookFirst, bookSecond) -> bookFirst.price > bookSecond.price;
if (isMoreExpensive.test(book1, book2)) {
System.out.println("Tak! Pierwsza książka jest droższa.");
}
Wynik: Tak! Pierwsza książka jest droższa.
Do przykładu metody and
potrzebujemy jeszcze jednego wyrażenia lambda, które sprawdza czy okładki są takie same. Metoda and
najpierw sprawdzi czy są takie same okładki i potem sprawdzi czy pierwsza książka jest droższa.
BiPredicate<Book, Book> sameCover = (bookFirst, bookSecond) -> bookFirst.cover.equals(bookSecond.cover);
if (sameCover.and(isMoreExpensive).test(book1, book2)) {
System.out.println("Takie same okładki i książka pierwsza jest droższa");
}
Wynik: Takie same okładki i książka pierwsza jest droższa
Kolejna metodą jest negate
, która odwraca zwrócony wynik:
boolean i = isMoreExpensive.negate().test(book1, book2);
System.out.println("Czy druga jest tańsza? " + i);
Wynik tego działania: Czy druga jest tańsza? false
Ostatnią metodą jest or
. Sprawdzimy tutaj czy nasza książka ma takie same okładki lub czy pierwsza jest droższa.
boolean or = sameCover.or(isMoreExpensive).test(book1, book2);
System.out.println("Jest droższa lub ta sama okładka? " + or);
Wynik: Jest droższa lub ta sama okładka? true