Узнайте, как группировать элементы коллекции с помощью Коллекции Eclipse.

С Новым Годом!

Это мой первый блог в 2019 году. Буду краток. Пришло время написать код.

Группа по

Метод groupBy возвращает Multimap в Коллекциях Eclipse. Multimap выглядит как Map в том смысле, что у него есть такие методы, как get и put, но значения в Multimap всегда относятся к некоторому типу Collection, например, List, Set или Bag.

Следующий код иллюстрирует, как сгруппировать коллекцию Fruit по их цвету. Мы сохраняем результат группировки в переменной с именем FRUIT_BY_COLOR. Обратите внимание, что это особый тип Multimap, потому что мы вызвали groupBy для ImmutableBag.

Мы можем запросить FRUIT_BY_COLOR Multimap для каждого цвета, используя метод getFruitByColor в перечислении Fruit.

Вот код в виде обычного текста, если вы хотите поэкспериментировать самостоятельно.

public enum Fruit
{
    APPLE(Color.RED),
    BANANA(Color.YELLOW),
    CHERRY(Color.RED),
    PEAR(Color.GREEN),
    STRAWBERRY(Color.RED),
    LEMON(Color.YELLOW),
    KIWI(Color.GREEN);

    private final Color color;

    private static final ImmutableBagMultimap<Color, Fruit> 
            FRUIT_BY_COLOR =
                Bags.immutable.with(Fruit.values())
                        .groupBy(Fruit::getColor);

    Fruit(Color color)
    {
        this.color = color;
    }

    public Color getColor()
    {
        return this.color;
    }

    public static ImmutableBag<Fruit> getFruitByColor(Color color)
    {
        return FRUIT_BY_COLOR.get(color);
    }

    public enum Color
    {
        RED, YELLOW, GREEN
    }
}

И код для теста.

public class FruitTest
{
    @Test
    public void redFruit()
    {
        Assert.assertEquals(
                Bags.immutable.with(
                        Fruit.APPLE,
                        Fruit.CHERRY,
                        Fruit.STRAWBERRY),
                Fruit.getFruitByColor(Fruit.Color.RED));
    }

    @Test
    public void yellowFruit()
    {
        Assert.assertEquals(
                Bags.immutable.with(
                        Fruit.BANANA,
                        Fruit.LEMON),
                Fruit.getFruitByColor(Fruit.Color.YELLOW));
    }

    @Test
    public void greenFruit()
    {
        Assert.assertEquals(
                Bags.immutable.with(
                        Fruit.PEAR,
                        Fruit.KIWI),
                Fruit.getFruitByColor(Fruit.Color.GREEN));
    }
}

API, рассмотренные в примерах

  1. groupBy - группирует Collection в Multimap, используя указанную функцию для вычисления ключа для каждого объекта. Тип Collection определяет тип Multimap, который возвращается.
  2. Bags.immutable.with - создает ImmutableBag с указанными элементами vararg’d. В Eclipse Collections есть изменяемые и неизменяемые Collection фабрики.
  3. get - возвращает Collection из Multimap. В случае ImmutableBagMultimap возвращает ImmutableBag.

Ознакомьтесь с этой презентацией, чтобы узнать больше о происхождении, дизайне и эволюции Eclipse Collections API.

Коллекции Eclipse открыты для взносов. Если вам нравится библиотека, вы можете сообщить нам об этом, отметив ее на GitHub.