Come posso verificare se uno Stream
è vuoto e lanciare un'eccezione se non lo è, come operazione non terminale?Come verificare se Java 8 Stream è vuoto?
Fondamentalmente, sto cercando qualcosa di equivalente al codice qui sotto, ma senza materializzare il flusso intermedio. In particolare, il controllo non dovrebbe verificarsi prima che il flusso sia effettivamente consumato da un'operazione 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();
}
Non puoi avere la tua torta e mangiarla anche - e letteralmente così, in questo contesto. Devi * consumare * il flusso per scoprire se è vuoto. Questo è il punto della semantica di Stream (pigrizia). –
Alla fine verrà consumato, a questo punto il controllo dovrebbe avvenire – Cephalopod
Per verificare che lo stream non sia vuoto devi tentare di consumare almeno un elemento. A quel punto il flusso ha perso la sua "verginità" e non può essere nuovamente consumato dall'inizio. –