Trong ứng dụng Spring của tôi, tôi có kho lưu trữ Couchbase cho loại tài liệu là QuoteOfTheDay
. Tài liệu này rất cơ bản, chỉ có một trường id kiểu UUID, trường giá trị kiểu String và trường ngày tạo kiểu Date.Java 8 Stream.findAny() vs tìm một phần tử ngẫu nhiên trong luồng
Trong lớp dịch vụ của tôi, tôi có phương thức trả về một trích dẫn ngẫu nhiên trong ngày. Ban đầu tôi đã cố gắng làm như sau, trả về một đối số kiểu Optional<QuoteOfTheDay>
, nhưng có vẻ như findAny() khá nhiều sẽ luôn trả về cùng một phần tử trong luồng. Hiện tại chỉ có khoảng 10 yếu tố.
public Optional<QuoteOfTheDay> random() {
return StreamSupport.stream(repository.findAll().spliterator(), false).findAny();
}
Vì tôi muốn một điều gì đó ngẫu nhiên hơn, tôi đã triển khai thực hiện các bước sau chỉ trả về QuoteOfTheDay
.
public QuoteOfTheDay random() {
int count = Long.valueOf(repository.count()).intValue();
if(count > 0) {
Random r = new Random();
List<QuoteOfTheDay> quotes = StreamSupport.stream(repository.findAll().spliterator(), false)
.collect(toList());
return quotes.get(r.nextInt(count));
} else {
throw new IllegalStateException("No quotes found.");
}
}
Tôi chỉ tò mò như thế nào phương pháp findAny()
của Suối thực sự hoạt động vì nó dường như không phải là ngẫu nhiên.
Cảm ơn.