Quindi, cerchiamo di immaginare ho il seguente elenco:versione più avanzata del Collections.frequency()
List<Foo> myList = getListFromSomePlace();
int frequency = Collections.frequency(myList, someFoo);
Questo conterà tutti someFoo
elementi corrispondenti.
Tuttavia, se ho una versione più "complesso":
List<Foo> myList = getListFromSomePlace();
int frequency = /* get number of Elements in the List whose getInternalFoo() match a certain value */
Un modo per farlo sarebbe quello di sovrascrivere il metodo equals
nella classe Foo, ma mi piacerebbe davvero evitare di mettere comportamento personalizzato nella classe Foo, specialmente perché potrei voler ottenere la frequenza in base a proprietà diverse dalla classe Foo, e posso avere solo una versione del metodo sovrascritto equals
.
Funzioni come Collections.sort
mi consentono di passare un comparatore personalizzato che farà esattamente ciò di cui ho bisogno, ma Collections.frequency non fornisce questo.
Con Java8, vorrei utilizzare un flusso e qualche espressione Lambda per risolvere questo problema, ma vorrei vedere se c'è una soluzione semplice che funzionerà con Java 7. Sto cercando qualcosa che non implichi codifica il metodo di frequenza personalizzato da solo, ma utilizzando alcune API esistenti. C'è qualcosa?
"Anche questa tecnica richiederà di ripetere due volte l'elenco. Una volta per applicare la mappatura; e una volta per controllare la frequenza. "Questo è falso, la trasformazione viene eseguita pigramente e verrà eseguita solo durante l'implementazione della frequenza. –
@LouisWasserman Oh, sì, hai assolutamente ragione, grazie per il resto. –
I Selezionando questa risposta come "Risposta corretta", le altre due risposte danno anche degli approcci interessanti. Seleziono questo perché la trasformazione di Guava consente un'implementazione che è la più simile a quella che sto cercando, specialmente perché lo fa non implica alcun 'hack',' duplicazione del codice', né più codice 'boilerplate'. Howerver, non significa che deve essere la soluzione più adatta per tutti o per ogni situazione ... – Martin