Eclipse Collections — это платформа Java Collections с открытым исходным кодом. Пожалуйста, обратитесь к ресурсам в конце блога для получения дополнительной информации о платформе. В этом блоге я собираюсь продемонстрировать пять менее известных функций фреймворка.
-
distinct(): Когда вы хотите получить уникальные элементы в своемListтипичный способ получить их — добавить свойListвSet. Однако вы теряете исходный порядок и в итоге получаете непредсказуемый порядок хеш-таблицы. Иногда вам нужно сохранить порядок, в котором мы посетили уникальные элементы. Для этого варианта использования мы разработалиdistinct(). Когда вы вызываетеMutableListdistinct()вMutableListколлекцийMutableList, в результате получаетсяListуникальных элементов.123456789@Testpublicvoiddistinct(){MutableList<Integer> integers = Lists.mutable.with(1,2,2,3,3,3,4,4,4,4);Assert.assertEquals(Lists.mutable.with(1,2,3,4),integers.distinct());}Если вы не можете преобразовать свой исходный
Listв список коллекций Eclipse, вы можете использоватьListAdapterилиListIterateчтобы получить тот же API.0102030405060708091011@TestpublicvoiddistinctNonEclipseCollectionsList(){List<Integer> integersLinkedList =newLinkedList<>(integers);Assert.assertEquals(Lists.mutable.with(1,2,3,4),ListAdapter.adapt(integersLinkedList).distinct());Assert.assertEquals(Lists.mutable.with(1,2,3,4),ListIterate.distinct(integersLinkedList));}Если вам нужен
LazyIterabledistinct()для ленивой оценки, он также доступен в нашемLazyIterable.0102030405060708091011@TestpublicvoiddistinctAsLazy(){MutableList<String> distinctStrings = integers.asLazy().distinct().collect(String::valueOf).toList();Assert.assertEquals(Lists.mutable.with("1","2","3","4"),distinctStrings);} -
partition(): если вы хотите выбрать и отклонить элементы за один проход на основе предиката, вы можете использоватьpartition()0102030405060708091011121314@Testpublicvoidpartition(){MutableList<Integer> integers = Lists.mutable.with(1,2,3,4,5,6,7,8,9);PartitionMutableList<Integer> evenOddPartition = integers.partition(each -> each %2==0);Assert.assertEquals(Lists.mutable.with(2,4,6,8),evenOddPartition.getSelected());Assert.assertEquals(Lists.mutable.with(1,3,5,7,9),evenOddPartition.getRejected());}Если вы не можете использовать интерфейс Eclipse Collections, вы всегда можете обернуть свои коллекции нашими адаптерами или использовать нашу статическую утилиту
Iterateчтобы получить тот же API.01020304050607080910111213141516171819202122232425@Testpublicvoidpartition(){List<Integer> integerList =newArrayList<>(integers);PartitionMutableList<Integer> evenOddUsingAdapter =ListAdapter.adapt(integerList).partition(each -> each %2==0);Assert.assertEquals(Lists.mutable.with(2,4,6,8),evenOddUsingAdapter.getSelected());Assert.assertEquals(Lists.mutable.with(1,3,5,7,9),evenOddUsingAdapter.getRejected());PartitionIterable<Integer> evenOddUsingIterate =Iterate.partition(integerList,each -> each %2==0);Assert.assertEquals(Lists.mutable.with(2,4,6,8),evenOddUsingIterate.getSelected());Assert.assertEquals(Lists.mutable.with(1,3,5,7,9),evenOddUsingIterate.getRejected());} -
selectInstancesOf(): если вы хотите фильтровать и возвращать только экземпляры определенного класса, вы можете использовать selectInstancesOf ().123456789@TestpublicvoidselectInstancesOf(){MutableList<Number> numbers = Lists.mutable.with(1.0,2,3.0,4.0,5);MutableList<Integer> integers = numbers.selectInstancesOf(Integer.class);Assert.assertEquals(Lists.mutable.with(2,5), integers);}Если вы не можете использовать интерфейс Eclipse Collections, вы всегда можете обернуть свои коллекции нашими адаптерами или использовать нашу статическую утилиту
Iterateчтобы получить тот же API.0102030405060708091011121314151617@TestpublicvoidselectInstancesOf(){List<Number> numberList =newArrayList<>(numbers);MutableList<Integer> integersUsingAdapter = ListAdapter.adapt(numberList).selectInstancesOf(Integer.class);Assert.assertEquals(Lists.mutable.with(2,5),integersUsingAdapter);Collection<Integer> integersUsingIterate = Iterate.selectInstancesOf(numberList, Integer.class);Assert.assertEquals(Lists.mutable.with(2,5),integersUsingIterate);} -
chunk(): если вы хотите разделить вашу итерацию на несколько итераций определенного размера, вы можете использоватьchunk().0102030405060708091011121314@Testpublicvoidchunk(){MutableList<Integer> integers = Lists.mutable.with(1,2,3,4,5);MutableList<MutableList<Integer>> expectedChunked =Lists.mutable.with(Lists.mutable.with(1,2),Lists.mutable.with(3,4),Lists.mutable.with(5));Assert.assertEquals(expectedChunked,integers.chunk(2));}Если вы не можете использовать интерфейс Eclipse Collections, вы всегда можете обернуть свои коллекции нашими адаптерами или использовать нашу статическую утилиту
Iterateчтобы получить тот же API.0102030405060708091011121314151617181920@Testpublicvoidchunk(){List<Integer> integerList =newArrayList<>(integers);RichIterable<RichIterable<Integer>> chunkUsingAdapter =ListAdapter.adapt(integerList).chunk(2);Assert.assertEquals(expectedChunked,chunkUsingAdapter);RichIterable<RichIterable<Integer>> chunkUsingIterate =Iterate.chunk(integerList,2);Assert.assertEquals(expectedChunked,chunkUsingIterate);} -
astoсоглашения об именах: в коллекциях Eclipse мы стараемся следовать общим соглашениям, подобным тем, которые описаны в этом блоге. В коллекциях Eclipse методы, начинающиеся со слова «как», всегда занимают постоянное время и создают постоянный мусор. Обычно это означает возвращение объекта-оболочки. Несколько примеров:-
-
asUnmodifiable()— возвращает обертки коллекции, которыеasUnmodifiable()методы -
asSynchronized()— возвращает обертки коллекции, которые захватывают блокировку перед делегированием -
asLazy()— возвращает оболочку, которая поддерживает отложенную оценку, откладывая оценку не завершающихся операций и вычисляя только при обнаружении завершающей операции -
asReversed()— возвращает ленивую обертку вокруг списка, которая повторяется в обратном порядке при принудительном вычислении -
asParallel()(Beta) — возвращаетasParallel()оболочку, которая поддерживает параллельное выполнение
-
В коллекциях Eclipse методы, начинающиеся со слова «to», могут занимать больше времени и создавать больше мусора. В большинстве случаев это означает создание новой коллекции за линейное время. В случае отсортированных коллекций это значение возрастает до O (n log n). Несколько примеров:
-
-
toList()— всегда создает новую копию, даже когда вызывается в списках -
toSet(),toBag(),toStack(),toMap(),toArray()— O (n) во времени и памяти -
toSortedList(),toSortedListBy(),toSortedSet(),toSortedSetBy(),toSortedMap()— O (n log n) время -
toImmutable()— время O (n) для изменяемых коллекций -
toReversed()— так же, какasReversed()но будет иметьasReversed()оценку -
toString()— да, это считается & # 55357; & # 56898;
-
-
Резюме:
В этом блоге я объяснил несколько менее известных функций Eclipse Collections Different (), partition (), selectInstancesOf (), chunk () и as () по сравнению с соглашениями об именах методов.
Надеюсь, вы нашли сообщение информативным. Если вы ранее не пользовались коллекциями Eclipse, попробуйте. Есть несколько ресурсов ниже. Обязательно покажите нам свою поддержку и поставьте звезду в нашем репозитории GitHub.
Ресурсы Коллекции Eclipse:
Eclipse Collections поставляется с собственными реализациями List , Set и Map . Он также имеет дополнительные структуры данных, такие как Multimap , Bag и вся иерархия Primitive Collections. Каждая из наших коллекций имеет богатый API для часто используемых итерационных шаблонов.
| Смотреть оригинальную статью здесь: Скрытые Сокровища Коллекций Затмения
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |