Ho una lista di elementi, ho bisogno di trovare il primo elemento che soddisfa la condizione quindi uscire utilizzando Java 8 flussi.Stream con Sort() prima di findFirst() non è più pigro
penso che il seguente codice purtroppo valutare tutti gli elementi a disposizione, che non quello che ho bisogno, ho bisogno di valutare gli elementi uno ad uno e stop (break
) quando trovare la prima partita:
sto qui Ordinamento della elementi, quindi mappare l'elemento al suo attributo url
quindi provare a filtrare se lo url
non è nullo o vuoto, quindi trovare la corrispondenza first
!
Arrays.stream(dataArray)
.sorted(Comparator.comparing(d -> d.getPriority()))
.peek(o -> System.out.println("SORT: " + o))
.map(d -> d.getOriginalURL(shortUrl))
.peek(o -> System.out.println("MAP: " + o))
.filter(u -> u != null && !u.isEmpty())
.peek(o -> System.out.println("FILTER: " + o))
.findFirst().orElse("");
Ma l'output mostra che, tutti gli elementi sono evaulated, anche se il primo corrisponde l'operazione if
condizione (filter
).
Data[] data = new Data[] { new ParseData(), new InMemoryData() };
System.out.println(">>> " + getOriginalURL(data, ""));
OUTPUT:
SORT: [email protected]
MAP: InMemory URL
FILTER: InMemory URL
SORT: [email protected]
MAP: Parse.com URL <<< THIS SHOULD NOT HAPPEN
FILTER: Parse.com URL <<< AND THIS TOO
>>> InMemory URL
Come dimostra uscita, il flusso non si ferma quando il filtro corrisponde al primo elemento, invece procedi valutare il secondo elemento troppo!
che voglio fare in questo modo:
Arrays.sort(dataArray, Comparator.comparing(d -> d.getPriority())); // sort
for (Data data : dataArray) {
String url = data.getOriginalURL(shortUrl); // map
if (url != null && !url.isEmpty()) { // filter
System.out.println("url :" + url);
return url; // find first
}
}
Sono d'accordo con te, specialmente se qualcuna delle operazioni di flusso intermedio è un'operazione costosa. (nella mia domanda il 'getOriginalURL' è un costoso! –
Yep, bug delle prestazioni. Archiviato [JDK-8042355] (https://bugs.openjdk.java.net/browse/JDK-8042355). –
@MuhammadHewedy Bella cattura, A proposito, grazie per aver sollevato questo problema –