Eclipseコレクションのプリミティブコレクション

1. 前書き

このチュートリアルでは、Javaのプリミティブコレクションとlink:/eclipse-collections[Eclipse Collections]がどのように役立つかについて説明します。

2. 動機

単純な整数のリストを作成するとします。
List<Integer> myList = new ArrayList<>;
int one = 1;
myList.add(one);
コレクションはオブジェクト参照のみを保持できるため、舞台裏で、_one_はプロセスでan _Integer_に変換されます。 *もちろん、ボクシングとアンボクシングは無料ではありません。 その結果、このプロセスでlink:/java-list-primitive-performance[performance]の損失が発生します。*
そのため、まず、Eclipse Collectionsのプリミティブコレクションを使用すると、速度が向上します。
第二に、メモリフットプリントを削減します。 以下のグラフは、Eclipse Collectionsの従来の_ArrayList_と_IntArrayList_のメモリ使用量を比較しています。
http://inprogress.baeldung.com/uploads/ints-300x207.png []
_ * https://www.eclipse.org/collections/#concept_から抽出した画像
そしてもちろん、さまざまな実装がEclipseコレクションの大きな売り手であることを忘れないでください。
また、これまでのJavaはプリミティブコレクションをサポートしていないことに注意してください。 ただし、https://openjdk.java.net/jeps/218 [JEP 218]を介してValhallaをプロジェクトに追加します。*

3. 依存関係

https://search.maven.org/search?q=g:org.eclipse.collections[Maven]を使用して、必要な依存関係を含めます。
<dependency>
    <groupId>org.eclipse.collections</groupId>
    <artifactId>eclipse-collections-api</artifactId>
    <version>10.0.0</version>
</dependency>

<dependency>
    <groupId>org.eclipse.collections</groupId>
    <artifactId>eclipse-collections</artifactId>
    <version>10.0.0</version>
</dependency>

4. _long_リスト

  • Eclipseコレクションには、すべてのprimitiveタイプのメモリ最適化リスト、セット、スタック、マップ、バッグがあります。 **いくつかの例を見てみましょう。

    まず、__ long__sのリストを見てみましょう。
@Test
public void whenListOfLongHasOneTwoThree_thenSumIsSix() {
    MutableLongList longList = LongLists.mutable.of(1L, 2L, 3L);
    assertEquals(6, longList.sum());
}

5. _int_リスト

同様に、__ int__sの不変リストを作成できます。
@Test
public void whenListOfIntHasOneTwoThree_thenMaxIsThree() {
    ImmutableIntList intList = IntLists.immutable.of(1, 2, 3);
    assertEquals(3, intList.max());
}

6. Maps

_Map_インターフェースメソッドに加えて、Eclipseコレクションは各プリミティブペアリングに新しいメソッドを提示します。
@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. _Iterable_からプリミティブコレクションまで

また、Eclipse Collectionsは_Iterable_で機能します。
@Test
public void whenConvertFromIterableToPrimitive_thenValuesAreEqual() {
    Iterable<Integer> iterable = Interval.oneTo(3);
    MutableIntSet intSet = IntSets.mutable.withAll(iterable);
    IntInterval intInterval = IntInterval.oneTo(3);
    assertEquals(intInterval.toSet(), intSet);
}
さらに、_Iterable:_からプリミティブマップを作成できます。
@Test
public void whenCreateMapFromStream_thenValuesMustMatch() {
    Iterable<Integer> 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 On Primitives

Javaには既にプリミティブストリームが付属しているため、Eclipse Collectionsはそれらにうまく統合されます。
@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. 結論

結論として、このチュートリアルではEclipse Collectionsからのプリミティブコレクションを紹介しました。 私たちはそれを利用する理由を示し、アプリケーションにどれだけ簡単に追加できるかを示しました。
いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/libraries-primitive[GitHubの上]で入手できます。