Come posso verificare se a Stream
è vuoto e lanciare un'eccezione in caso contrario, come operazione non terminale?
Fondamentalmente, sto cercando qualcosa di equivalente al codice seguente, ma senza materializzare il flusso intermedio. In particolare, il controllo non dovrebbe avvenire prima che il flusso venga effettivamente consumato da un'operazione del terminale.
public Stream<Thing> getFilteredThings() {
Stream<Thing> stream = getThings().stream()
.filter(Thing::isFoo)
.filter(Thing::isBar);
return nonEmptyStream(stream, () -> {
throw new RuntimeException("No foo bar things available")
});
}
private static <T> Stream<T> nonEmptyStream(Stream<T> stream, Supplier<T> defaultValue) {
List<T> list = stream.collect(Collectors.toList());
if (list.isEmpty()) list.add(defaultValue.get());
return list.stream();
}