Узнайте, как группировать элементы коллекции с помощью Коллекции 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, рассмотренные в примерах
groupBy
- группируетCollection
вMultimap
, используя указанную функцию для вычисления ключа для каждого объекта. ТипCollection
определяет типMultimap
, который возвращается.Bags.immutable.with
- создаетImmutableBag
с указанными элементами vararg’d. В Eclipse Collections есть изменяемые и неизменяемыеCollection
фабрики.get
- возвращаетCollection
изMultimap
. В случаеImmutableBagMultimap
возвращаетImmutableBag
.
Ознакомьтесь с этой презентацией, чтобы узнать больше о происхождении, дизайне и эволюции Eclipse Collections API.
Коллекции Eclipse открыты для взносов. Если вам нравится библиотека, вы можете сообщить нам об этом, отметив ее на GitHub.