Làm cách nào để kiểm tra xem Stream
có trống không và ném một ngoại lệ nếu không, như một hoạt động không phải thiết bị đầu cuối?Làm cách nào để kiểm tra xem Java 8 Stream có trống không?
Về cơ bản, tôi đang tìm kiếm nội dung nào đó tương đương với mã bên dưới, nhưng không thực hiện luồng ở giữa. Đặc biệt, việc kiểm tra không nên xảy ra trước khi luồng thực sự được tiêu thụ bởi một hoạt động đầu cuối.
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();
}
Bạn không thể có bánh của bạn và ăn nó quá - và khá nghĩa đen như vậy, trong bối cảnh này. Bạn phải * tiêu thụ * luồng để tìm hiểu xem nó có trống không. Đó là điểm của ngữ nghĩa của luồng (lười biếng). –
Nó sẽ được tiêu thụ cuối cùng, tại thời điểm này việc kiểm tra sẽ xảy ra – Cephalopod
Để kiểm tra xem luồng có trống không, bạn phải cố gắng tiêu thụ ít nhất một phần tử. Tại thời điểm đó, dòng suối đã mất đi "sự trinh tiết" của nó và không thể bị tiêu thụ lại từ đầu. –