Java 9 Clase Optional mejorada

Java 9 新特性Nuevas características de Java 9

La clase Optional se introdujo en Java 8. La introducción de la clase Optional resolvió muy bien el problema de la excepción de puntero nulo. En Java 9, se agregaron tres métodos para mejorar su funcionalidad:

  • stream()
  • ifPresentOrElse()
  • or()

Método stream()

Sintaxis

public Stream<T> stream()

El método stream convierte un Optional en un Stream. Si el Optional contiene un valor, devuelve un Stream que contiene ese valor; de lo contrario, devuelve un Stream vacío (Stream.empty()).

Ejemplo

import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; public class Tester { public static void main(String[] args) { List<Optional<String>> list = Arrays.asList ( Optional.empty(), Optional.of("A"), Optional.empty(), Optional.of("B")); //filter the list based to print non-empty values //if optional is non-empty, get the value in stream, otherwise return empty List<String> filteredList = list.stream() .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty()) .collect(Collectors.toList()); //Optional::stream method will return a stream of either one //or zero element if data is present or not. List<String> filteredListJava9 = list.stream() .flatMap(Optional::stream) .collect(Collectors.toList()); System.out.println(filteredList); System.out.println(filteredListJava9); } }

El resultado de la ejecución es:

[A, B]
[A, B]

Método ifPresentOrElse()

Sintaxis

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

La mejora del método ifPresentOrElse es que ahora tiene else; acepta dos parámetros: Consumer y Runnable.

El propósito del método ifPresentOrElse es: si un Optional contiene un valor, llama a la función action sobre el valor contenido, es decir, action.accept(value), lo cual coincide con ifPresent; la diferencia con el método ifPresent es que ifPresentOrElse tiene un segundo parámetro emptyAction — si el Optional no contiene un valor, entonces ifPresentOrElse llama a emptyAction, es decir, emptyAction.run().

Ejemplo

import java.util.Optional; public class Tester { public static void main(String[] args) { Optional<Integer> optional = Optional.of(1); optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() -> System.out.println("Not Present.")); optional = Optional.empty(); optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() -> System.out.println("Not Present.")); } }

El resultado de la ejecución es:

Value: 1
Not Present.

Método or()

Sintaxis

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

Si el valor está presente, devuelve el valor especificado por Optional; de lo contrario, devuelve un valor preestablecido.

Ejemplo

import java.util.Optional; import java.util.function.Supplier; public class Tester { public static void main(String[] args) { Optional<String> optional1 = Optional.of("Mahesh"); Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present"); optional1 = optional1.or( supplierString); optional1.ifPresent( x -> System.out.println("Value: " + x)); optional1 = Optional.empty(); optional1 = optional1.or( supplierString); optional1.ifPresent( x -> System.out.println("Value: " + x)); } }

El resultado de la ejecución es:

Value: Mahesh
Value: Not Present

Java 9 新特性Nuevas características de Java 9