Klíčem k efektivnímu využití Optional je používání metod, které dokáží s Optional pracovat. Tyto metody buď zpracují hodnotu zabalenou v Optional, nebo, v případě, že není přítomna, vytvoří náhradní hodnotu (objekt).
Metoda Optional.ifPresent() jako parametr bere funkci java.util.function.Function a v případě, že Optional obsahuje hodnotu (referenci na objekt), je tato hodnota (reference) předána funkci. Pokud hodnotu neobsahuje, nic se nestane.
Stream<Integer> is1 = Stream.of(5, 7, 1, 8, 2); Optional<Integer> max = is1.max(Integer::compareTo); Stream<Integer> is2 = Stream.empty(); Optional<Integer> min = is2.min(Integer::compareTo);
Výpis výsledků do konzole (vypíše 8):
max.ifPresent((i) -> System.out.println(i)); min.ifPresent((i) -> System.out.println(i));
Přidání výsledků do listu:
List<Integer> results = new ArrayList<>(); max.ifPresent((i) -> results.add(i)); min.ifPresent((i) -> results.add(i));
Metoda Optional.ifPresent() zpracovává hodnotu v případě, že je přítomna. Dalším způsobem je použít metody, které vytvoří hodnotu (nebo něco provedou) v případě, že hodnota není přítomna. Pro tento případ se hodí metody optionalVariable.orElse(), optionalVariable.orElseGet(), optionalVariable.orElseThrow().
Stream<String> ss1 = Stream.of("lokomotiva", "auto", "letadlo", "raketa", "vzducholoď"); Optional<String> firstWithL = ss1.filter((word) -> word.startsWith("l")).findFirst(); Stream<String> ss2 = Stream.of("lokomotiva", "auto", "letadlo", "raketa", "vzducholoď"); Optional<String> anyWithQ = ss2.filter((word) -> word.startsWith("q")).findAny(); String withL = firstWithL.orElse(""); String withQ1 = anyWithQ.orElse(""); System.out.println(withL); System.out.println(withQ1); try { String withQ2 = anyWithQ.orElseThrow(Exception::new); } catch (Exception e) { e.printStackTrace(); }
Výpis:
lokomotiva java.lang.Exception at java.util.Optional.orElseThrow(...)
Metoda Optional.orElse() vrátí v případě, že Optional obsahuje null, náhradní hodnotu zadanou jako parametr. Pokud Optional obsahuje referenci, vrátí objekt. Metoda Optional.orElseThrow() vyhodí danou výjimku (pokud Optional obsahuje null).
Zdroj: HORSTMANN, Cay S. Java SE 8 for the really impatient. Upper Saddle River, NJ: Addison-Wesley, 2014, xv, 215 pages. ISBN 0321927761.