Nella mia applicazione Spring, ho un repository Couchbase per un tipo di documento di QuoteOfTheDay
. Il documento è molto semplice, ha solo un campo id di tipo UUID, campo valore di tipo String e campo data di creazione di tipo Data.Java 8 Stream.findAny() rispetto alla ricerca di un elemento casuale nello stream
Nella mia classe di servizio, ho un metodo che restituisce una citazione casuale del giorno. Inizialmente ho provato semplicemente a fare quanto segue, che ha restituito un argomento di tipo Optional<QuoteOfTheDay>
, ma sembrerebbe che findAny() restituisca quasi sempre lo stesso elemento nel flusso. Ci sono solo circa 10 elementi al momento.
public Optional<QuoteOfTheDay> random() {
return StreamSupport.stream(repository.findAll().spliterator(), false).findAny();
}
Poiché volevo qualcosa di più casuale, ho realizzato le seguenti che restituisce solo un 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.");
}
}
Sono solo curioso come il metodo di flusso findAny()
effettivamente funziona in quanto non sembra essere casuale.
Grazie.