Se você estiver aberto para usar uma biblioteca de terceiros, poderá usar a Collectors2
classe em Coleções do Eclipse para convertê-la List
em uma Bag
usando 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 collect
o List
diretamente para a Bag
.
Bag<String> counted =
list.stream().collect(Collectors2.toBag());
Você também pode criar o Bag
sem usar a Stream
, adaptando o List
com 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 Map
chave que não contenha, ela retornará null
. Se você solicitar uma Bag
chave, ela não conterá o uso deoccurrencesOf
, ela retornará 0.
Nota: Sou um colaborador das Coleções Eclipse.