Java 8 aquí. Tengo que buscar dos listas de POJOs para una cadena y desea utilizar las API opcionales / Stream correctamente.
Si el nombre aparece en la primera lista (" lunches
") entonces quiero devolver un opcional que lo contiene. De lo contrario, si el nombre aparece en la segunda lista (" dinners
") entonces quiero devolver un opcional que lo contiene. De lo contrario, quiero volver Optional.empty()
si el nombre no existe en ninguna de las listas. Mi mejor intento hasta el momento:
public class Restaurant {
private String id;
private String name;
private List<Food> lunches;
private List<Food> dinners;
public Optional<Food> findFoodByName(String name) {
return Optional.of(lunches.stream()
.filter(food -> food.getName()
.equalsIgnoreCase(name))
.findFirst())
.orElse(dinners.stream()
.filter(food -> food.getName()
.equalsIgnoreCase(name))
.findFirst());
// .orElse(null); TODO: how to return empty optional if neither in 'lunches' nor 'dinners'?
}
}
¿Puede alguien me ayuda cruzar la línea de meta aquí?
Combinar tanto la lista utilizando Stream.of
y compruebe si hay elemento o devoluciónOptional.empty()
Stream.of(lunches, dinners)
.flatMap(List::stream)
.filter(s -> s.getName()
.equalsIgnoreCase(name))
.findFirst();
De acuerdo con la sugerencia de @Holger también se puede utilizar Stream.concat
a concat dos corrientes y para verificar si el elemento
Stream.concat(lunches.stream(), dinners.stream())
.filter(s -> s.getName()
.equalsIgnoreCase(name))
.findFirst();