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
|
@Testpublic 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
|
@Testpublic 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
|
@Testpublic 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
|
@Testpublic 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
|
@Testpublic 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, являются их собственными. |