Как я могу проверить, является ли Stream
пустым и выдает исключение, если это не так, как операция без терминала?Как проверить, нет ли потока Java 8?
В принципе, я ищу что-то, что эквивалентно приведенному ниже коду, но без материализации потока между ними. В частности, проверка не должна происходить до того, как поток фактически будет потреблен при работе терминала.
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();
}
Вы не можете иметь свой торт и съесть его тоже - и в буквальном смысле это так. Вы должны * потреблять * поток, чтобы узнать, пуст ли он. Это точка семантики Стива (лень). –
В конечном итоге он будет уничтожен, в этот момент должна произойти проверка. – Cephalopod
Чтобы проверить, что поток не пуст, вы должны попытаться использовать хотя бы один элемент. В этот момент поток потерял свою «девственность» и больше не может потребляться с самого начала. –