Статьи

Скрытые Сокровища коллекций Затмения — выпуск 2019 года

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 для часто используемых шаблонов итераций.

Смотреть оригинальную статью здесь: Скрытые Сокровища коллекций Затмения — выпуск 2019 года

Мнения, высказанные участниками Java Code Geeks, являются их собственными.