Wyjaśnienie nowych funkcjonalności Java 8.

0

Witam. Ostatnio chciałem trochę lepiej poznać Javę 8 i zastosowania nowych funkcji języka. Chciałbym się jednak upewnić od bardziej doświadczonych osób czy wszystko dobrze zrozumiałem i nie przegapiłem czegoś ważnego jeśli chodzi o zastosowania.

  1. Metody domyślne. Pozwalają definiować domyślne metody w interfejsach, ale tworzenie tego typu metod jest raczej nie zalecane. Zorientowałem się, że głównym powodem wprowadzenia metod domyślnych w interfejsach, było ułatwienie wprowadzenie zmian w API. Zawsze dodanie nowej metody do interfejsu wymuszało zdefiniowanie jej w klasach implementujących co było czasochłonne. Przykładem jest metoda forEach w interfejsie Iterable. Dodana po to abyśmy mogli korzystać z interfejsów funkcjonalnych i wyrażeń lambda podczas iteracji. Czy są jakieś inne tego typu przykłady w API Javy?

  2. Metody lambda. Stworzone w celu skrócenia zapisu metod anonimowych. Używane tylko wraz z interfejsami funkcjonalnymi.

  3. Referencje do metod. Uproszczenie podczas przekazywania jako argumentów metod interfejsów funkcjonalnych. Nie musimy pisać całego wyrażenia lambda, tylko wystarczy przekazać samą metodę. Przykład:

SuperClass superClass= (item) -> Integer.valueOf(item);

Możemy to skrócić:

SuperClass superClass= Integer::valueOf;
  1. Optionale. Pozwalają uniknąć wyjątku NPE. Informują, że zmienna może przyjąć wartość null, przez co wiemy, że powinniśmy obsłużyć przypadek z nullem. Pozwalają na wyeliminowanie łańcuchów sprawdzania nulli, przykładowo:
if (outer != null && outer.nested != null && outer.nested.inner != null)

z optionalem:

Optional.of(new Outer())
    .map(Outer::getNested)
    .map(Nested::getInner)
    .map(Inner::getFoo)
    .ifPresent(System.out::println); 
2

Nie rozumiem twojego postu, ale jeżeli szukasz nowości w javie 8 (która już swoją drogą się starzeje)
https://github.com/winterbe/java8-tutorial

Optionale byly dostepne wcześniej, nie nowość.

P.S

optionale nie są tylko po to żeby sygnalizować możliwość braku parametru,można je wykorzystać jako if-stejtment, bo kto dzisiaj ifow używa.

System.out.println(opt.map(o -> "Found")
                      .orElse("Not found"));
4

ad 1. Częściowo tak. Chodziło o możliwość rozszerzania interfejsów z zachowaniem kompatybilności wstecznej. Nie należy unikać implementacji takich metod we własnym kodzie, bo pozwalają one na generalizację pewnych algorytmów/zachowań.

ad 2. Nie do końca. Samo skrócenie zapisu to bonus. Zmienia się filozofia działania takiej metody. Klasa anonimowa nadal jest klasą. Wyrażenie lambda ma charakter wywołania dynamicznego. Oznacza to, że jest kompilowane jako prywatna metoda klasy, a nie pełnoprawna klasa.

ad 3. Tak, choć pod spodem działa tu invokedynamic, a nie wywołanie metody jak w przypadku lambd.

ad 4. Podobnie jak w 1. Samo skrócenie zapisu to tylko dodatek. Optional jest konstrukcją pozwalającą na implementację wielu algorytmów i operacji w sposób bezpieczny. Efektywnie pozwala nie tylko na eliminację NPE, ale też wprowadzenie wartości domyślnych, eliminację w niektórych przypadkach instrukcji warunkowych dzięki wykorzystaniu ifPresent, składanie funkcji z wykorzystaniem Optional.map.

1 użytkowników online, w tym zalogowanych: 0, gości: 1