1. 序章

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

2. 動機

整数の単純なリストを作成するとします。

List<Integer> myList = new ArrayList<>; 
int one = 1; 
myList.add(one);

コレクションはオブジェクト参照のみを保持できるため、舞台裏では、oneはプロセスで整数に変換されます。 もちろん、ボクシングとアンボクシングは無料ではありません。 その結果、このプロセスでパフォーマンスが低下します。

したがって、最初に、Eclipseコレクションのプリミティブコレクションを使用すると、速度が向上します。

第二に、それはメモリフットプリントを削減します。 以下のグラフは、Eclipseコレクションの従来のArrayListIntArrayListのメモリ使用量を比較しています。

*https://www.eclipse.org/collections/#conceptから抽出された画像

そしてもちろん、忘れないでください。さまざまな実装がEclipseコレクションの大きな売り手です。

これまでのJavaはプリミティブコレクションをサポートしていないことにも注意してください。 ただし、JEP218によるプロジェクトValhallaはそれを追加することを目的としています。

3. 依存関係

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. 長いリスト

Eclipseコレクションには、すべてのプリミティブタイプのメモリ最適化リスト、セット、スタック、マップ、およびバッグがあります。 いくつかの例に飛び込みましょう。

まず、longのリストを見てみましょう。

@Test
public void whenListOfLongHasOneTwoThree_thenSumIsSix() {
    MutableLongList longList = LongLists.mutable.of(1L, 2L, 3L);
    assertEquals(6, longList.sum());
}

5. intリスト

同様に、intの不変リストを作成できます。

@Test
public void whenListOfIntHasOneTwoThree_thenMaxIsThree() {
    ImmutableIntList intList = IntLists.immutable.of(1, 2, 3);
    assertEquals(3, intList.max());
}

6. マップ

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からPrimitiveCollectionsへ

また、Eclipseコレクションは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. プリミティブ上のストリーム

Javaにはすでにプリミティブストリームが付属しているため、Eclipseコレクションはそれらとうまく統合されます。

@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コレクションからのプリミティブコレクションを紹介しました。 それを利用する理由を示し、アプリケーションに簡単に追加できることを示しました。

いつものように、コードはGitHubから入手できます。