JAVA 8

Obsah

  • Lambda (lambfa expression)
  • Odkazy na metody (Method references)
  • Defaultní metody (Default method)
  • Optional
  • Stream API
  • DateTime API
  • novinky v nástrojích( tools, utiliti, compiler) 

Lambda expression

  • přímá implementace místo anonymní třídy
  • implementace funkčního interface = interface co má práve jednu metodu
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("RUN");      
    }
};

Runnable runnable = () -> System.out.println("RUN");

Lambda expression

Syntax

  • arguments - (int x, int y)
  • arrow - ->
  • body - x+y

Lambda expression

java.util.function

  • Predicate<T>: test predpokladu objektu
  • Consumer<T>: vykoná akci nad objektem
  • Function<T, R>: konverze T -> R 
  • Supplier<T>: Poskytne instanci objektu T
  • UnaryOperator<T>: operace T -> T
  • BinaryOperator<T>: operace (T, T) -> T

Lambda expression

Omezení?

  • horší čitelnost stackTrace a debug 
  • horší čitelnost nového kódu
  • checked výjimky musí být vyřešeny uvnitř.
  • genericita musí být v interface, ne jen metoda

Method reference

  • umožňuje odkazovat se na metody operátorem ::
  • statické, instanční a kontruktor

Method reference

public class Customer {
    
    ...

    public void printName() {
        System.out.println(name);
    }
}

customers.forEach(Customer::printName);

Default method

  • umožňuje implementovat metodu v interface
  • označují se 'default'
  • umožňuje pozměnit interface bez zásahu do implementací
  • umožňuje mnohonásobnou dědičnost

Default method

Problémy?

  • Diamond problem
    • více interfaces obsahuje stejnou default metodu.

Optional<T>

  • Wrapper pro object
  • Kontejner který může ale nemusí obsahovat daný objekt
  • Při jeho zpracování musíme kontrolovat co v něm je
public Optional<Customer> getCustomer(String name) {}

Customer customer = getCustomer("jikra").orElse(DEFAULT_CUSTOMER);

Optional<T>

Proč a kdy ho používat?

  • Zjednoduší kód
  • Odstraní/Zmenší výskyt NPE
  • Používat výhradně jako return type

Optional<T>

funkce

  • Vytvoření optional
    • Optional.of()
    • Optional.ofNullable()
    • Optional.empty()
  • ifPresent - provede předanou fci když obsahuje data
  • orElse/orElseGet - když neobsahuje data, dodá defaultní
  • orElseThrow - vyhodí exception když data nejsou
  • filter - na základě předané fce vrátí Optinal z daty nebo bez
  • map - pokud obsahuje data, aplikuje na ně předanou funkci
  • flatMap - to same jako map, ale zabrání Optional<Optional<T>> zdvojení

Streams

  • reprezentuje sequenci objektů ze zdroje
  • podporuje agregační operace(filter, map, sort,..)
  • operace lze řetězit
  • jak se jednou projde tak se uzavře 

Streams

  • Operace nad stremem: 
    • přechodné - vrací stream
    • koncové - nevrací stream

 

  • Vytvoření streamu:
    • Stream.of(), Stream.generate()
    • stream() - standartní stream nad daty
    • parallelStream() - nativní podpora pro multithread

Streams

metody

  • Filter
    • filter - vrátí stream s daty splňující předanou podmínku
    • distinct - vrátí stream s unikátními daty
    • limit(n) - vrátí stream s maximální velikostí n
    • skip(n) - vrátí stream bez n prvních znaků

Streams

metody

  • Match
    • anyMatch - alespoň jedna hodnota splňuje podmínku
    • allMatch - všechna data splňují podmínku
    • noneMatch - žádný z prvků nesplňuje podmínku 
  • Find
    • findFirst - vrací první prvek ze streamu (jako Optional)
    • findAny - vrací nějaký prvek ze streamu (jako Optional)

Streams

metody

  • Map - nad každým prvkem v 1 úrovni provede funkci
  • FlatMap - nad každým prvkem ve 2 úrovních provede funkci 
source :   {{a, b},{c, d},{e, f}}
map ->     {a, b}, {c, d}, {e, f}
flatmap -> {a, b, c, d, e, f}

Streams

metody

  • Reduce - kombinuje vsechny elementy do jednoho
  • Collect - umožňuje uložit data ze streamu do kolekce

DateTime API

  • náhrada za nepoužitelné java.util.Date
  • velice podobné jodaTime
  • threadsafe - všechny core třídy jsou immutable

DateTime API

  • LocalDate - pouze datum
  • LocalTime - pouze čas
  • LocalDateTime - datum a čas

 

  • ZonedDateTime - datum a čas s časovou zónou
  • OffsetTime - čas posunutý do časové zóny

DateTime API

  • Periods - doba mezi daty (roky, měsíce, dny)
  • Durations - přesná doba mezi časy
  • ChronoUnit - umožňuje změřit čas v určitých jednotkách(dny, měsíce)

DateTime API

  • SQL mapování
DATE LocalDate
TIME LocalTime
TIMESTAMP LocalDateTime
TIME WITH TIMEZONE OffsetTime
TIMESTAMP WITH TIMEZONE OffsetDateTime

Jiné

  • vylepšení security (algoritmy, TLS1.2)
  • reflexe parametrů metod (-parameters)
  • nashorn - javascript v JVM

JAVA 8

By Jiří Čížek

JAVA 8

  • 376