Come quasi tutti, sto ancora imparando le complessità (e il loro amore) della nuova API di Java 8 Streams. Ho una domanda sull'uso dei flussi. Fornirò un esempio semplificato.Java 8 Stream possono operare su un elemento di una raccolta e quindi rimuoverlo?
Java Streaming ci consente di prendere uno Collection
e utilizzare il metodo stream()
su di esso per ricevere un flusso di tutti i suoi elementi. Al suo interno, esistono numerosi metodi utili, come ad esempio filter()
, map()
e forEach()
, che ci consentono di utilizzare le operazioni lambda sui contenuti.
Ho codice che assomigli a questo (semplificato):
set.stream().filter(item -> item.qualify())
.map(item -> (Qualifier)item).forEach(item -> item.operate());
set.removeIf(item -> item.qualify());
L'idea è quella di ottenere una mappatura di tutti gli elementi del set, che corrispondono a una certa qualificazione, e quindi operare attraverso di loro. Dopo l'operazione, non hanno altro scopo e devono essere rimossi dal set originale. Il codice funziona bene, ma non riesco a scuotere la sensazione che ci sia un'operazione in Stream
che potrebbe farlo per me, in una singola riga.
Se si tratta di Javadoc, potrei trascurarlo.
Qualcuno più familiare con l'API vede qualcosa del genere?
+1 per l'utilizzo di un ciclo for; non utilizzare gli stream solo per poter adattare il codice su una sola riga. I loop sono spesso più leggibili rispetto alle soluzioni di streaming, anche se sono più prolissi. – dimo414
Sono un po 'titubante nell'inserire il codice che modifica lo stato in 'removeIf()', anche se credo che ciò funzionerebbe teoricamente. Inoltre, la mia situazione si presta alla programmazione funzionale, quindi il mio bisogno di flussi va oltre il confezionamento di tutto in un'unica linea; ma grazie. –
L'uso di 'removeIf' con espressione lambda è perfettamente legittimo e deve essere usato in questo modo. La modifica dello stato fa parte della raccolta API e non lo streaming. – hussachai