W mojej aplikacji Spring mam repozytorium Couchbase dla typu dokumentu QuoteOfTheDay
. Dokument jest bardzo prosty, ma tylko pole id typu UUID, pole wartości typu String i utworzone pole daty typu Date.Java 8 Stream.findAny() vs znajdowanie losowego elementu w strumieniu
W mojej klasie usług, mam metodę, która zwraca losową ofertę dnia. Początkowo próbowałem po prostu wykonać następujące czynności, które zwróciły argument typu Optional<QuoteOfTheDay>
, ale wydaje się, że findAny() prawie zawsze zwraca ten sam element w strumieniu. W tej chwili jest tylko około 10 elementów.
public Optional<QuoteOfTheDay> random() {
return StreamSupport.stream(repository.findAll().spliterator(), false).findAny();
}
Ponieważ chciałem coś bardziej losowy, I wdrożone następujące która po prostu zwraca 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.");
}
}
Jestem tylko ciekaw, jak metoda Stream findAny()
faktycznie działa, ponieważ nie wydaje się być przypadkowe.
Dzięki.