Miesiąc: Marzec 2020

Interfejsy funkcjonalne wprowadzone w Java 8

Interfejs funkcjonalny jest interfejsem posiadającym przynajmniej jedną metodę abstrakcyjną (single abstract method). W omawianym interfejsie możesz zdefiniować wiele metod abstrakcyjnych i statycznych. Przykład Interfejsu funkcjonalnego:
java.util.function jest pakietem, który zawiera predefiniowane interfejsy.

4.1 Predicate 

Funkcja matematyczna, która zwraca wartość prawda fałsz. w zależności czy warunek zostanie spełniony lub nie. Czyli jest to metoda zwracająca wartość boolean.
– Predicate jest interfejsem funkcjonalnym wprowadzonym od Java 1.8
– interfejs zawiera tylko jedną metodę test(), która przyjmuje jedną wartość, wykonuje sprawdzenie na podstawie przesłanego warunku i  zwraca wartość boolean.

package functional.staticMethods;
import java.util.function.Predicate;

przykład implementacji interfejsu funkcjonalnego Predicate  przyjmującego parametr generyczny typu Integer

public class PredicateSampleInt {
  public static void main(String[] args) {
    Predicate<Integer> p = i -> i>10;
    System.out.println(p.test(100));
    System.out.println(p.test(9)); 

  }

inny przykład implementacji Predicate przyjmującego parametr generyczny typu String

public class PredicateSampleString {
  public static void main(String[] args) {
    Predicate<String> p = s -> s>5;
    System.out.println(p.test(„Ala ma kota));
    System.out.println(p.test(„Kot)); 
  }

inny przykład implementacji Predicate przyjmującego parametr generyczny typu Collection

public class PredicateSampleString {
  public static void main(String[] args) {
ArrayList a = new ArrayList<>{};
a.add(„a”);
    Predicate<Collection> p = c-> c.isEmpty();
    System.out.println(p.test(p(1));
    System.out.println(p.test(3)); 
  } 
istnieje również możliwość łączenia predykatów:
-negaca p1.negate()
-koniunkcja p1.and(p2)
-alternatywa p1.or(p2)

Różnice między interfejsem z metodą domyślną a klasą abstrakcyjną

Poniżej przedstawiam listę różnic pomiędzy interfejsem z metodą domyślną a klasą abstrakcyjną w Java 1.8

Interfejs z metodą domyślną:
1. Wewnątrz interfejsu każda zmienna jest zawsze public static final nie można zadeklarować instancji zmiennej.
2. Interfejs nie przechowuje stanu obiektu
3. Wewnątrz interfejsu nie można deklarować konstruktora
4. Wewnątrz interfejsu nie można deklarować instancji oraz bloków statycznych (static blocks)
5. Interfejs funkcjonalny z metodą domyślną może zawierać wyrażenia lambda
6. Wewnątrz interfejsu nie można nadpisywać metod klasy obiektowej (object class methods)

Klasa abstrakcyjna:
1. Wewnątrz klasy abstrakcyjnej można deklarować instancje zmiennych, które są wymagane w klasach dziedziczących.
2. Klasa abstrakcyjna może przechowywać stan obiektu
3. W klasie abstrakcyjnej można deklarować konstruktory
4. W klasie abstrakcyjnej można deklarować instancje obiektu oraz bloki statyczne
5. Klasa abstrakcyjna nie może zawierać wyrażeń lambda
6. Wewnątrz klasy abstrakcyjnej możesz nadpisywać metody klasy obiektowej