ejemplo baeldung java java-8 optional

baeldung - optional java ejemplo



¿Hay una clase como Opcional pero para no opcionales? (4)

Es útil declarar funciones para asignar valores y consumirlos si están presentes.

En la situación en la que tiene varios objetos obligatorios y varios Opcionales, me encuentro envolviendo los demás en Opcional.of (obligatorioObjeto) también, así puedo usar las mismas expresiones en ellos sin escribirlos al revés.

Food vegetables = Food.someVegetables(); Optional<Food> condiment = Food.someCondiment(); Optional<Food> spices = Food.someSpices(); condiment.map(prepare).ifPresent(putOnPlate); spices.map(prepare).ifPresent(putOnPlate);

Pero entonces no me gusta este código:

putOnPlate.accept(prepare.apply(vegetables));

así que lo envuelvo:

Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);

Pero eso es simplemente incorrecto, porque las verduras (en este ejemplo) no son de hecho opcionales. Son muy importantes y solo les di a todos la impresión de que son opcionales.

Así que mi pregunta es: ¿hay alguna clase en java como java.util.Mandatory para que pueda escribir:

Mandatory.of(vegetables).map(prepare).definitelyPresentSo(putOnPlate);


La idea principal detrás de Optional es abstraer la nulabilidad (deshacerse de los cheques nulos) y proporcionar una API fluida para trabajar con valores opcionales.

En el caso de un valor que siempre está presente, no hay nada que abstraer (al menos nada con un valor práctico), por lo que no existen tales herramientas en Java puro.

En otros lenguajes funcionales, tiene múltiples herramientas ''monádicas'' como Optional disponible para diferentes casos de uso. Si quieres traerlos a Java, Javaslang es probablemente el mejor lugar para mirar. Puede encontrar herramientas como Option , Try , Lazy , Validation , Either , Future , Tuple y toda la Collections API que permite la codificación de la misma manera que describió.


Parece que estás buscando el tipo @NonNull Food .


Puede que me equivoque, pero si no te gusta usar Optional , solo puedes usar una Stream de un solo objeto. Así que en lugar de

Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);

solo puedes usar:

Stream.of(vegetables).map(prepare).forEach(putOnPlate);

El resultado será idéntico. Ambos métodos lanzarán NPE si las verduras son nulas.

Arrays.asList(10, null).forEach(value -> { Optional.of(value).map(x -> x.toString()).ifPresent(System.out::println); Stream.of(value).map(x -> x.toString()).forEach(System.out::println); });

La versión segura de NPE va a ser

Optional.ofNullable(value).map(x -> x.toString()).ifPresent(System.out::println); Stream.of(value).filter(Objects::nonNull).map(x -> x.toString()).forEach(System.out::println);

Optional es solo un contenedor para un objeto que puede o no contener un valor no nulo.


Sí, hay tal API. Usted puede reemplazar

Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);

con

Stream.of(vegetables).map(prepare).forEach(putOnPlate);

Ahora tengo que vivir con el hecho de que el Stream un solo elemento es un caso especial del flujo de elementos arbitrarios (incluido el posible flujo vacío).

Pero puedes manejar todos los elementos obligatorios a la vez.

Stream.of(mandatory1, mandatory2, mandatory3 /* etc */).map(prepare).forEach(putOnPlate);

Incluso sería posible incorporar los elementos opcionales, pero no será tan conveniente como debería ser, ya que Optional.stream() no se presentará hasta Java 9.