Статьи

Скрытые Сокровища Коллекций Затмения

Eclipse Collections — это платформа Java Collections с открытым исходным кодом. Пожалуйста, обратитесь к ресурсам в конце блога для получения дополнительной информации о платформе. В этом блоге я собираюсь продемонстрировать пять менее известных функций фреймворка.

  1. distinct() : Когда вы хотите получить уникальные элементы в своем List типичный способ получить их — добавить свой List в Set . Однако вы теряете исходный порядок и в итоге получаете непредсказуемый порядок хеш-таблицы. Иногда вам нужно сохранить порядок, в котором мы посетили уникальные элементы. Для этого варианта использования мы разработали distinct() . Когда вы вызываете MutableList distinct() в MutableList коллекций MutableList , в результате получается List уникальных элементов.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @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.

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    @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 .

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    @Test
    public void distinctAsLazy()
    {
        MutableList<String> distinctStrings = integers.asLazy()
                .distinct()
                .collect(String::valueOf)
                .toList();
        Assert.assertEquals(
                Lists.mutable.with("1", "2", "3", "4"),
                distinctStrings);
    }
  2. partition() : если вы хотите выбрать и отклонить элементы за один проход на основе предиката, вы можете использовать partition()
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    @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.

    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
    @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());
    }
  3. selectInstancesOf() : если вы хотите фильтровать и возвращать только экземпляры определенного класса, вы можете использовать selectInstancesOf ().
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @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.

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    @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);
    }
  4. chunk() : если вы хотите разделить вашу итерацию на несколько итераций определенного размера, вы можете использовать chunk() .
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    @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.

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    @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);
    }
  5. 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, являются их собственными.