Eclipse Collections — это платформа Java Collections с открытым исходным кодом. В этом блоге я собираюсь продемонстрировать пять менее известных функций фреймворка. Я опубликовал аналогичный блог в календаре Java Advent в прошлом году. Пожалуйста, обратитесь к ресурсам в конце блога для получения дополнительной информации о платформе.
1. countBy()
: если вы хотите узнать количество определенных объектов, вы можете использовать API countBy()
чтобы получить Bag. Цель Bag — поддерживать отображение объекта на счет. Сумка может быть использована для запроса количества предметов за O(1)
раз. Bag также предоставляет дополнительный полезный API, который помогает в подсчете. Узнайте больше о структуре данных Bag в этом блоге .
01
02
03
04
05
06
07
08
09
10
11
12
|
@Test public void countBy() { MutableList<String> strings = Lists.mutable.with( "A" , "B" , "C" , "A" , "B" , "A" ); Bag<String> stringToCount = strings.countBy(each -> each); assertEquals( 3 , stringToCount.occurrencesOf( "A" )); assertEquals( 2 , stringToCount.occurrencesOf( "B" )); assertEquals( 1 , stringToCount.occurrencesOf( "C" )); assertEquals( 3 , stringToCount.sizeDistinct()); assertEquals( 6 , stringToCount.size()); } |
2. reject()
: если вы хотите выбрать элементы, которые не удовлетворяют предикату, вы можете использовать API reject()
. Этот API предназначен для повышения читабельности и интуитивности для разработчиков. Вы можете использовать reject()
вместо использования select()
и отрицания логического условия. В сущности, все элементы, которые не возвращают true
для логического условия, будут выбраны при использовании reject()
. Вывод reject(BooleanCondition)
такой же, как и при select(!someBooleanCondition)
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@Test public void reject() { MutableList<Integer> numbers = Lists.mutable.with( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ); MutableList<Integer> odds = numbers.reject(num -> num % 2 == 0 ); // reject pattern used to find odd numbers. // Notice there is no negation in the predicate. assertEquals(Lists.mutable.with( 1 , 3 , 5 , 7 , 9 ), odds); MutableList<Integer> oddsUsingSelect = numbers.select(num -> num % 2 != 0 ); assertEquals(odds, oddsUsingSelect); } |
3. makeString()
: если вам нужно настраиваемое строковое представление RichIterable
вы можете использовать makeString()
. Если вы используете makeString()
без разделителя, тогда используется разделитель по умолчанию "comma space" ( ", " )
. Если вам нужен определенный разделитель, вы можете передать его в makeString()
и выходная строка будет иметь строковое представление, где каждый элемент отделен разделителем. Разделитель не используется, если размер Iterable
равен 1.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
@Test public void makeString() { MutableList<Integer> nums = Lists.mutable.with( 1 , 2 , 3 ); assertEquals( "[1, 2, 3]" , nums.toString()); // Notice the difference: toString() vs makeString(). // the ", " delimiter is used by default assertEquals( "1, 2, 3" , nums.makeString()); // Delimiter of choice can be passed assertEquals( "1;2;3" , nums.makeString( ";" )); MutableList<Integer> singleElement = Lists.mutable.with( 1 ); // Delimiter is not used for size = 1 assertEquals( "1" , singleElement.makeString()); assertEquals( "1" , singleElement.makeString( ";" )); } |
4. zip()
: если вы хотите сшить два OrderedIterable
s, вы можете использовать zip()
. API zip()
работает с двумя OrderedIterable
и сшивает их так, что вы получаете OrderedIterable
из Pair
элементов. В Pair
первый из Pair
является элементом из первого OrderedIterable
а второй из Pair
является элементом из второго OrderedIterable
. В случае, если OrderedIterable
имеют разные размеры, избыточные элементы из более длинного OrderedIterable
игнорируются. Вывод zip()
представляет собой OrderedIterable
того же размера, что и меньший OrderedIterable
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
@Test public void zip() { MutableList<Integer> nums = Lists.mutable.with( 1 , 2 , 3 ); MutableList<String> strings = Lists.mutable.with( "A" , "B" , "C" ); assertEquals( Lists.mutable.with(Tuples.pair( 1 , "A" ), Tuples.pair( 2 , "B" ), Tuples.pair( 3 , "C" )), nums.zip(strings)); assertEquals( Lists.mutable.with(Tuples.pair( "A" , 1 ), Tuples.pair( "B" , 2 ), Tuples.pair( "C" , 3 )), strings.zip(nums)); MutableList<Integer> numsSmallerSize = Lists.mutable.with( 1 ); assertEquals( Lists.mutable.with(Tuples.pair( 1 , "A" )), numsSmallerSize.zip(strings)); assertEquals( Lists.mutable.with(Tuples.pair( "A" , 1 )), strings.zip(numsSmallerSize)); MutableList<String> stringsSmallerSize = Lists.mutable.with( "A" , "B" ); assertEquals( Lists.mutable.with(Tuples.pair( 1 , "A" ), Tuples.pair( 2 , "B" )), nums.zip(stringsSmallerSize)); assertEquals( Lists.mutable.with(Tuples.pair( "A" , 1 ), Tuples.pair( "B" , 2 )), stringsSmallerSize.zip(nums)); } |
5. corresponds()
: Когда вы хотите выяснить, все ли элементы двух OrderedIterable
одинаковы в соответствии с Predicate
вы можете использовать API OrderedIterable
corresponds()
. API OrderedIterable
corresponds()
работает, сначала проверяя, имеют ли два OrderedIterable
одинаковый размер, если они имеют одинаковый размер, то соответствующие элементы обоих OrderedIterable
оцениваются с использованием Predicate
переданного в OrderedIterable
corresponds()
. Если размер OrderedIterable
s равен, а Predicate
возвращает true
для всех элементов, тогда OrderedIterable
corresponds()
возвращает true
. Если размер OrderedIterable
s не равен или Predicate
возвращает false
для какого-либо элемента, тогда OrderedIterable
corresponds()
возвращает false
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
@Test public void corresponds() { MutableList<Integer> lhs1 = Lists.mutable.with( 1 , 2 , 3 ); MutableList<Integer> rhs1 = Lists.mutable.with( 1 , 2 , 3 ); assertTrue(lhs1.corresponds(rhs1, Integer::equals)); MutableList<Integer> lhs2 = Lists.mutable.with( 1 , 2 , 3 ); MutableList<Integer> rhs2 = Lists.mutable.with( 2 , 4 , 6 ); assertTrue( lhs2.corresponds(rhs2, (lhs, rhs) -> rhs == 2 * lhs)); assertFalse( lhs2.corresponds(rhs2, (lhs, rhs) -> rhs == lhs * lhs)); assertFalse(lhs2.corresponds(rhs2, Integer::equals)); MutableList<Integer> lhs3 = Lists.mutable.with( 1 , 2 ); MutableList<Integer> rhs3 = Lists.mutable.with( 1 , 2 , 3 ); assertFalse(lhs3.corresponds(rhs3, Integer::equals)); } |
Ресурсы Коллекции Eclipse:
Eclipse Collections поставляется с собственными реализациями List , Set и Map . Он также имеет дополнительные структуры данных, такие как Multimap , Bag и вся иерархия Primitive Collections. Каждая из наших коллекций имеет свободный и богатый API для часто используемых шаблонов итераций.
- Веб-сайт
- Исходный код на GitHub ( Обязательно добавьте репозиторий )
- Руководство по вкладам
- Справочное руководство
- Скрытые Сокровища Коллекций Затмения Издание 2018 года
Смотреть оригинальную статью здесь: Скрытые Сокровища коллекций Затмения — выпуск 2019 года Мнения, высказанные участниками Java Code Geeks, являются их собственными. |