Conta le ricorrenze int con Java8

C’è un modo migliore per contare le ricorrenze int con Java8

int[] monthCounter = new int[12]; persons.stream().forEach(person -> monthCounter[person.getBirthday().getMonthValue() - 1]++); 

Provare:

  Map counters = persons.stream() .collect(Collectors.groupingBy(p -> p.getBirthday().getMonthValue(), Collectors.counting())); 

Con le raccolte di Eclipse (ex GS Collections ), puoi utilizzare una struttura dati chiamata Bag che può contenere il numero di occorrenze di ciascun elemento.

Utilizzando IntBag , il seguente funzionerà:

 MutableList personsEC = ListAdapter.adapt(persons); IntBag intBag = personsEC.collectInt(person -> person.getBirthDay().getMonthValue()).toBag(); intBag.forEachWithOccurrences((month, count) -> System.out.println("Count of month:" + month + " is " + count)); 

Se si desidera utilizzare una matrice per tenere traccia del conteggio, è ansible combinare con l’approccio Arrays.setAll() che Brian ha indicato in un’altra risposta.

 int[] monthCounter = new int[12]; MutableList personsEC = ListAdapter.adapt(persons); IntBag bag = personsEC.collectInt(person -> person.getBirthDay().getMonthValue()).toBag(); Arrays.setAll(monthCounter, bag::occurrencesOf); System.out.println(IntLists.immutable.with(monthCounter)); 

Questo codice funzionerà anche con Java 5 – 7 se si utilizzano classi interne anonime invece di lambda.

Nota: sono un committer per le raccolte di Eclipse

 int size = persons.stream().count()