Pozostałe interfejsy funkcjonalne #9
Omówienie pozostałych interfejsów funkcjonalnych w Java8
Pozostałe interfejsy funkcjonalne #9
Przed nami ostatnia partia interfejsów funkcjonalnych, jakie znalazły się w Javie 8. Są to wyspecjalizowane wersje interfejsów, które już omówiliśmy w poprzednich odcinkach. Zdefiniowane są na konkretnych typach i głównie tym się różnią od generycznych interfejsów, które omówiliśmy.
ObjDoubleConsumer – akceptuje dowolny obiekt i wartość double, nie zwraca wyniku. Jest to wyspecjalizowany interfejs, patrz: BiConsumer.
ObjDoubleConsumer objDoubleConsumer = (s,d) -> System.out.println(s+d);
objDoubleConsumer.accept("PI równa się: ", 3.14 );
Wynik: PI równa się: 3.14
ObjIntConsumer – akceptuje dowolny obiekt i wartość integer, nie zwraca wyniku. Jest to wyspecjalizowany interfejs, patrz: BiConsumer.
ObjIntConsumer<Double> doubleObjIntConsumer = (d,i)->System.out.println("I tak jestem PI: " + (i+d));
doubleObjIntConsumer.accept(0.14,3);
Wynik: I tak jestem PI: 3.14
ObjLongConsumer – akceptuje dowolny obiekt i wartość long, nie zwraca wyniku. Jest to wyspecjalizowany interfejs, patrz: BiConsumer.
ObjLongConsumer<String> stringObjLongConsumer = (s,d)->System.out.println(s+d);
stringObjLongConsumer.accept("Jestem najdłuższą liczbą świata!: ",Long.MAX_VALUE);
Wynik: Jestem najdłuższą liczbą świata!: 9223372036854775807
ToDoubleBiFunction – akceptuje dwa argumenty i zwraca wynik w postaci double. Jest to wyspecjalizowany interfejs, patrz: BiFunction.
ToDoubleBiFunction<Integer, Integer> toDoubleBiFunction = (x, y) -> (x + y) / 3.14;
System.out.println(toDoubleBiFunction.applyAsDouble(2,3));
Wynik: 1.592356687898089
ToDoubleFunction – akceptuje dowolny obiekt i zwraca wynik w postaci double. Jest to wyspecjalizowany interfejs, patrz: BiFunction.
ToDoubleFunction<String> toDoubleFunction = (x) -> Double.valueOf(x);
System.out.println(toDoubleFunction.applyAsDouble("3.14"));
Wynik: 3.14
DoubleBinaryOperator – akceptuje dwa argumenty w postaci double i zwraca wynik double. Jest to wyspecjalizowany interfejs, patrz: BinaryOperator.
DoubleBinaryOperator doubleBinaryOperator = (x, y) -> x + y;
System.out.println(doubleBinaryOperator.applyAsDouble(3.0, 0.14));
Wynik: 3.14
DoubleConsumer – akceptuje argument w postaci double, nie zwraca wyniku. Jest to wyspecjalizowany interfejs, patrz: Consumer.
DoubleConsumer doubleConsumer = x -> System.out.println(x + 3.0);
doubleConsumer.accept(0.14);
Wynik: 3.14
DoubleFunction – akceptuje argument w postaci double i zwraca wynik jako dowolny obiekt. Jest to wyspecjalizowany interfejs, patrz: Function.
DoubleFunction doubleFunction = x -> "Jestem stringiem PI: " +x;
System.out.println(doubleFunction.apply(3.14));
Wynik: Jestem stringiem PI: 3.14
DoublePredicate – akceptuje argument double i zwraca wynik w postaci boolean. Jest to wyspecjalizowany interfejs, patrz: Predicate.
DoublePredicate doublePredicate = x -> x > 3.14;
System.out.println("Czy jestem większa od PI? " + doublePredicate.test(2.14));
Wynik: Czy jestem większa od PI? false
DoubleSupplier – dostarcza obiekty typu double. Jest to wyspecjalizowany interfejs, patrz: Supplier.
DoubleSupplier doubleSupplier = () -> 3.14;
System.out.println("Dostarczam PI: " + doubleSupplier.getAsDouble());
Wynik: Dostarczam PI: 3.14
DoubleToIntFunction – akceptuje argument double, zwraca wartość integer. Jest to wyspecjalizowany interfejs, patrz: Function.
DoubleToIntFunction doubleToIntFunction = x -> (int) Math.round(x);
System.out.println("Jestem okrągłe PI: " + doubleToIntFunction.applyAsInt(3.14));
Wynik: Jestem okrągłe PI: 3
DoubleToLongFunction – akceptuje argument double, zwraca wartość long. Jest to wyspecjalizowany interfejs, patrz: Function.
DoubleToLongFunction doubleToLongFunction = x -> Math.round(x);
System.out.println("Jestem okrągłe PI jako long: " + doubleToLongFunction.applyAsLong(3.14));
Wynik: Jestem okrągłe PI jako long: 3
DoubleUnaryOperator – akceptuje argument double, zwraca wartość double. Jest to wyspecjalizowany interfejs, patrz: UnaryOperator.
DoubleUnaryOperator doubleUnaryOperator = x -> x*2;
System.out.println("Jestem podwojone PI: " + doubleUnaryOperator.applyAsDouble(3.14));
Wynik: Jestem podwojone PI: 6.28
Omówione wyżej interfejsy mają także swoje wersje, które operują na Longach czy Integerach:
LongBinaryOperator,LongConsumer,LongFunction,LongPredicate,LongSupplier,LongToDoubleFunction,LongToIntFunction,LongUnaryOperator,ToLongBiFunction,ToLongFunctionIntBinaryOperator,IntConsumer,IntFunction,IntPredicate,IntSupplier,IntToDoubleFunction,IntToLongFunction,IntUnaryOperator,ToIntBiFunction,ToIntFunction
Nie będziemy jednak ich omawiać, bo zasada działania jest taka sama. Ważne jest abyśmy wiedzieli, że mamy do dyspozycji gotowe interfejsy, które operują na konkretnych typach i nie musimy korzystać z wersji generycznych.
Cały kod znajdziecie także na githubie.