Примеры последних шести новых функций в последней крупной версии библиотеки 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.