Примеры последних шести новых функций в последней крупной версии библиотеки Eclipse Collections.

Резюме

В этом блоге я расскажу о последних шести из двадцати шести новых функций, перечисленных в Блоге с обзором выпуска Eclipse Collections 10.0. Первая часть серии тематических блогов посвящена первым десяти функциям Eclipse Collections 10.0. Часть вторая охватила вторую десятку функций.

21. RichIterable.getAny

Метод getAny вернет первый элемент, возвращаемый из Collection без какой-либо гарантии порядка. Этот метод предназначен для использования в качестве лучшей альтернативы getFirst, который не рекомендуется RichIterable для неупорядоченных коллекций.

@Test
public void getAny()
{
    Interval interval = Interval.fromTo(100, 1);
    Integer anyList =
            Lists.mutable.withAll(interval).getAny();
    Integer anySet =
            Sets.mutable.withAll(interval).getAny();
    Integer anyBag =
            Bags.mutable.withAll(interval).getAny();
    Integer anyStack =
            Stacks.mutable.withAll(interval).getAny();
    Assert.assertEquals(Integer.valueOf(100), anyList);
    Assert.assertEquals(Integer.valueOf(1), anySet);
    Assert.assertEquals(Integer.valueOf(1), anyBag);
    Assert.assertEquals(Integer.valueOf(1), anyStack);
}

22. Обновите и стандартизируйте изменение размера / повторное хеширование для примитивных хэш-структур.

Этот элемент является скорее улучшением, чем функцией пользователя, но я подумал, что он достаточно примечателен, чтобы отдать должное, поскольку он влияет на все наши примитивные хэш-структуры. Основное изменение коснулось метода rehashAndGrow для хэш-структур.

9.2 Версия

private void rehashAndGrow()
{
    this.rehash(this.table.length << 1);
}

Версия 10.0

private void rehashAndGrow()
{
    int max = this.maxOccupiedWithData();
    int newCapacity = Math.max(max, smallestPowerOfTwoGreaterThan((this.occupiedWithData + 1) << 1));
    if (this.occupiedWithSentinels > 0 && (max >> 1) + (max >> 2) < this.occupiedWithData)
    {
        newCapacity <<= 1;
    }
    this.rehash(newCapacity);
}

23. Фабричные методы преобразования Iterable в примитивные коллекции

До Eclipse Collections 10.0, если вы хотели преобразовать Iterable упакованных примитивных типов в примитив Collection (например, Integer - ›int), вам нужно было сначала преобразовать Iterable в Collection или Stream. В случае Stream вы можете затем использовать один из стандартных примитивов Collectors в Collectors2 для преобразования в примитив Collection. Теперь вы можете использовать следующие фабричные методы для преобразования из Iterable некоторого упакованного значения, такого как Integer, в примитив Collection. Это работает для всех типов примитивов в штучной упаковке для всех поддерживаемых типов Collection примитивов.

@Test
public void convertFromIterableToPrimitiveCollection()
{
    Iterable<Integer> iterable = Interval.oneTo(5);
    IntInterval intInterval = IntInterval.oneTo(5);
    MutableIntList mIntList = 
            IntLists.mutable.withAll(iterable);
    ImmutableIntList iIntList = 
            IntLists.immutable.withAll(iterable);
    Assert.assertEquals(intInterval, mIntList);
    Assert.assertEquals(intInterval, iIntList);
    MutableIntSet mIntSet = 
            IntSets.mutable.withAll(iterable);
    ImmutableIntSet iIntSet = 
            IntSets.immutable.withAll(iterable);
    Assert.assertEquals(intInterval.toSet(), mIntSet);
    Assert.assertEquals(intInterval.toSet(), iIntSet);
    MutableIntBag mIntBag = 
            IntBags.mutable.withAll(iterable);
    ImmutableIntBag iIntBag = 
            IntBags.immutable.withAll(iterable);
    Assert.assertEquals(intInterval.toBag(), mIntBag);
    Assert.assertEquals(intInterval.toBag(), iIntBag);
}

24. ImmutableSortedBagMultimapFactory в Multimaps

Нам давно не хватало ImmutableSortedBagMultimapFactory в классе Multimaps. Эта функция была добавлена, но в настоящее время есть проблема с именами, которую я обнаружил во время написания блога об этой функции и поднял проблему, которую нужно исправить.

Https://github.com/eclipse/eclipse-collections/issues/737

25. Метод фабрики карт, который принимает параметр карты.

Теперь вы можете построить MutableMap, используя другой Map или MapIterable в качестве параметра Maps фабричного класса.

@Test
public void mapFactoryThatTakesMapAsParameter()
{
    MutableMap<Integer, Integer> mutableSource =
            Maps.mutable.with(1, 1, 2, 2, 3, 3);
    ImmutableMap<Integer, Integer> immutableSource =
            Maps.immutable.with(1, 1, 2, 2, 3, 3);
    Assert.assertEquals(mutableSource, immutableSource);
    MutableMap<Integer, Integer> mutableOf =
            Maps.mutable.ofMap(mutableSource);
    MutableMap<Integer, Integer> mutableWith =
            Maps.mutable.withMap(mutableSource);
    Assert.assertEquals(mutableSource, mutableOf);
    Assert.assertEquals(immutableSource, mutableWith);
    MutableMap<Integer, Integer> mutableOfMI =
            Maps.mutable.ofMapIterable(immutableSource);
    MutableMap<Integer, Integer> mutableWithMI =
            Maps.mutable.withMapIterable(immutableSource);
    Assert.assertEquals(immutableSource, mutableOfMI);
    Assert.assertEquals(immutableSource, mutableWithMI);
}

26. Тип подстановочного знака в MultableMultimap.putAllPairs и методах добавления.

Эта функция была общим изменением, внесенным в add ( Pair ) и два метода putAllPairs в MutableMultimap. Оба параметра Pair теперь используют ? extends.

boolean add(Pair<? extends K, ? extends V> keyValuePair)
boolean putAllPairs(Pair<? extends K, ? extends V>... pairs)
boolean putAllPairs(Iterable<? extends Pair<? extends K, ? extends V>> pairs)

Пример использования:

@Test
public void wildcardInMutableMultimapPutAllPairs()
{
    MutableListMultimap<CharSequence, CharSequence> multimap =
            Multimaps.mutable.list.empty();
    multimap.add(Tuples.pair("1-5", "1"));
    multimap.putAllPairs(
            Tuples.pair("1-5", "2"),
            Tuples.pair("1-5", "3"));
    multimap.putAllPairs(
            Lists.mutable.with(
                    Tuples.pair("1-5", "4"),
                    Tuples.pair("1-5", "5")));
    Multimap<String, String> expected =
            Interval.oneTo(5)
                    .collect(Object::toString)
                    .groupBy(e -> "1-5");
    Assert.assertEquals(expected, multimap);
}

Вот и все, ребята!

Я рассмотрел все функции Eclipse Collections 10.0.

Надеюсь, вам понравятся все новые возможности Eclipse Collections 10.0!

Я руководитель проекта и ответственный за проект OSS Коллекции Eclipse в Eclipse Foundation. Eclipse Collections открыта для пожертвований. Если вам нравится библиотека, вы можете сообщить нам об этом, отметив ее на GitHub.