Se você estiver aberto para usar uma biblioteca de terceiros, poderá usar a Collectors2classe em Coleções do Eclipse para convertê-la Listem uma Bagusando a Stream. A Bagé uma estrutura de dados criada para a contagem .
Bag<String> counted =
list.stream().collect(Collectors2.countBy(each -> each));
Assert.assertEquals(1, counted.occurrencesOf("World"));
Assert.assertEquals(2, counted.occurrencesOf("Hello"));
System.out.println(counted.toStringOfItemToCount());
Resultado:
{World=1, Hello=2}
Nesse caso em particular, você pode simplesmente collecto Listdiretamente para a Bag.
Bag<String> counted =
list.stream().collect(Collectors2.toBag());
Você também pode criar o Bagsem usar a Stream, adaptando o Listcom os protocolos Eclipse Collections.
Bag<String> counted = Lists.adapt(list).countBy(each -> each);
ou neste caso particular:
Bag<String> counted = Lists.adapt(list).toBag();
Você também pode simplesmente criar a bolsa diretamente.
Bag<String> counted = Bags.mutable.with("Hello", "Hello", "World");
A Bag<String>é como um Map<String, Integer>, pois ele internamente controla as chaves e suas contagens. Mas, se você solicitar uma Mapchave que não contenha, ela retornará null. Se você solicitar uma Bagchave, ela não conterá o uso deoccurrencesOf , ela retornará 0.
Nota: Sou um colaborador das Coleções Eclipse.