Coleções primitivas nas coleções Eclipse
1. Introdução
Neste tutorial, falaremos sobre coleções primitivas em Java e comoEclipse Collections pode ajudar.
2. Motivação
Suponha que desejemos criar uma lista simples de números inteiros:
List myList = new ArrayList<>;
int one = 1;
myList.add(one);
Como as coleções só podem conter referências de objetos, nos bastidores,one é convertido emInteger no processo. The boxing and unboxing aren’t free, of course. As a result, there’s a performance loss in this process.
Portanto, primeiro, o uso de coleções primitivas da Eclipse Collections pode nos dar um aumento de velocidade.
Segundo, reduz a pegada de memória. O gráfico abaixo compara o uso de memória entre osArrayList tradicionais eIntArrayList das coleções do Eclipse:
* Imagem extraída dehttps://www.eclipse.org/collections/#concept
E, claro, não vamos esquecer, a variedade de implementações é um grande sucesso para as Coleções Eclipse.
Observe também que Java até este ponto não tem suporte para coleções primitivas. No entanto,Project Valhalla through JEP 218 aims to add it.
3. Dependências
UsaremosMaven para incluir as dependências necessárias:
org.eclipse.collections
eclipse-collections-api
10.0.0
org.eclipse.collections
eclipse-collections
10.0.0
4. Listalong
Eclipse Collections has memory-optimized lists, sets, stacks, maps, and bags for all the primitive types. Vamos pular para alguns exemplos.
Primeiro, vamos dar uma olhada em uma lista delongs:
@Test
public void whenListOfLongHasOneTwoThree_thenSumIsSix() {
MutableLongList longList = LongLists.mutable.of(1L, 2L, 3L);
assertEquals(6, longList.sum());
}
5. Listaint
Da mesma forma, podemos criar uma lista imutável deints:
@Test
public void whenListOfIntHasOneTwoThree_thenMaxIsThree() {
ImmutableIntList intList = IntLists.immutable.of(1, 2, 3);
assertEquals(3, intList.max());
}
6. Maps
Além dos métodos de interfaceMap, Eclipse Collections apresenta novos métodos para cada emparelhamento primitivo:
@Test
public void testOperationsOnIntIntMap() {
MutableIntIntMap map = new IntIntHashMap();
assertEquals(5, map.addToValue(0, 5));
assertEquals(5, map.get(0));
assertEquals(3, map.getIfAbsentPut(1, 3));
}
7. DeIterable para coleções primitivas
Além disso, Eclipse Collections funciona comIterable:
@Test
public void whenConvertFromIterableToPrimitive_thenValuesAreEqual() {
Iterable iterable = Interval.oneTo(3);
MutableIntSet intSet = IntSets.mutable.withAll(iterable);
IntInterval intInterval = IntInterval.oneTo(3);
assertEquals(intInterval.toSet(), intSet);
}
Além disso, podemos criar um mapa primitivo deIterable:
@Test
public void whenCreateMapFromStream_thenValuesMustMatch() {
Iterable integers = Interval.oneTo(3);
MutableIntIntMap map =
IntIntMaps.mutable.from(
integers,
key -> key,
value -> value * value);
MutableIntIntMap expected = IntIntMaps.mutable.empty()
.withKeyValue(1, 1)
.withKeyValue(2, 4)
.withKeyValue(3, 9);
assertEquals(expected, map);
}
8. Streams em primitivos
Como o Java já vem com fluxos primitivos, o Eclipse Collections se integra perfeitamente a eles:
@Test
public void whenCreateDoubleStream_thenAverageIsThree() {
DoubleStream doubleStream = DoubleLists
.mutable.with(1.0, 2.0, 3.0, 4.0, 5.0)
.primitiveStream();
assertEquals(3, doubleStream.average().getAsDouble(), 0.001);
}
9. Conclusão
Em conclusão, este tutorial apresentou coleções primitivas das Coleções Eclipse. Demonstramos razões para utilizá-lo e apresentamos com que facilidade podemos adicioná-lo a nossos aplicativos.
Como sempre, o código está disponívelover on GitHub.