Wie kann ich überprüfen, ob a Stream
leer ist, und eine Ausnahme auslösen, wenn dies nicht der Fall ist, als nicht-terminale Operation?
Grundsätzlich suche ich nach etwas, das dem folgenden Code entspricht, ohne jedoch den dazwischen liegenden Stream zu materialisieren. Insbesondere sollte die Überprüfung nicht erfolgen, bevor der Stream tatsächlich von einer Terminaloperation verbraucht wird.
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();
}