Eclipse Collections — это платформа Java Collections с открытым исходным кодом. Пожалуйста, обратитесь к ресурсам в конце блога для получения дополнительной информации о платформе. В этом блоге я собираюсь продемонстрировать пять менее известных функций фреймворка.
-
distinct()
: Когда вы хотите получить уникальные элементы в своемList
типичный способ получить их — добавить свойList
вSet
. Однако вы теряете исходный порядок и в итоге получаете непредсказуемый порядок хеш-таблицы. Иногда вам нужно сохранить порядок, в котором мы посетили уникальные элементы. Для этого варианта использования мы разработалиdistinct()
. Когда вы вызываетеMutableList
distinct()
вMutableList
коллекцийMutableList
, в результате получаетсяList
уникальных элементов.123456789@Test
public
void
distinct()
{
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@Test
public
void
distinctNonEclipseCollectionsList()
{
List<Integer> integersLinkedList =
new
LinkedList<>(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));
}
Если вам нужен
LazyIterable
distinct()
для ленивой оценки, он также доступен в нашемLazyIterable
.0102030405060708091011@Test
public
void
distinctAsLazy()
{
MutableList<String> distinctStrings = integers.asLazy()
.distinct()
.collect(String::valueOf)
.toList();
Assert.assertEquals(
Lists.mutable.with(
"1"
,
"2"
,
"3"
,
"4"
),
distinctStrings);
}
-
partition()
: если вы хотите выбрать и отклонить элементы за один проход на основе предиката, вы можете использоватьpartition()
0102030405060708091011121314@Test
public
void
partition()
{
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@Test
public
void
partition()
{
List<Integer> integerList =
new
ArrayList<>(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@Test
public
void
selectInstancesOf()
{
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@Test
public
void
selectInstancesOf()
{
List<Number> numberList =
new
ArrayList<>(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@Test
public
void
chunk()
{
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@Test
public
void
chunk()
{
List<Integer> integerList =
new
ArrayList<>(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);
}
-
as
to
соглашения об именах: в коллекциях 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, являются их собственными. |