Узнайте, как использовать метод countBy
в Коллекциях Eclipse.
CountBy
Метод countBy
возвращает Bag
в коллекциях Eclipse. Bag
- это неупорядоченный Collection
, который допускает дублирование. Внутренняя структура реализации HashBag
в Eclipse Collections - это ObjectIntHashMap
. Ключи внутренней карты - это элементы, а значения - это числа, хранящиеся как целые числа. Метод countBy
принимает в качестве аргумента Function
.
Следующий код иллюстрирует, как подсчитать коллекцию Fruit
по их цвету, используя ссылку на метод. Мы сохраняем результат в переменной с именем COUNTS_BY_COLOR
.
У нас есть два метода, которые запрашивают созданный ImmutableBag
. Они используются в следующих тестах.
Вот код в виде обычного текста, если вы хотите поэкспериментировать самостоятельно.
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 ImmutableBag<Color> COUNTS_BY_COLOR = Bags.immutable.with(Fruit.values()) .countBy(Fruit::getColor); Fruit(Color color) { this.color = color; } public Color getColor() { return this.color; } public static int getColorCount(Color color) { return COUNTS_BY_COLOR.occurrencesOf(color); } public static boolean isTopColor(Color color) { return COUNTS_BY_COLOR.topOccurrences(1) .anySatisfy(each -> each.getOne() == color); } public enum Color { RED, YELLOW, GREEN } }
И код для теста.
public class FruitTest { @Test public void redFruit() { Assert.assertEquals(3, Fruit.getColorCount(Fruit.Color.RED)); Assert.assertTrue( Fruit.isTopColor(Fruit.Color.RED)); } @Test public void yellowFruit() { Assert.assertEquals(2, Fruit.getColorCount(Fruit.Color.YELLOW)); Assert.assertFalse( Fruit.isTopColor(Fruit.Color.YELLOW)); } @Test public void greenFruit() { Assert.assertEquals(2, Fruit.getColorCount(Fruit.Color.GREEN)); Assert.assertFalse( Fruit.isTopColor(Fruit.Color.GREEN)); } }
API, рассмотренные в примерах
countBy
- Подсчитывает элементыCollection
по заданномуFunction
и возвращает Сумку.Bags.immutable.with
- создаетImmutableBag
с указанными элементами vararg’d. В Eclipse Collections есть изменяемые и неизменяемыеCollection
фабрики.occurrencesOf
- возвращает количество отBag
для определенного элемента.topOccurrences
- возвращаетList
элементов и их количество в порядке убывания по количеству вхождений.
Ознакомьтесь с этой презентацией, чтобы узнать больше о происхождении, дизайне и эволюции Eclipse Collections API.
Коллекции Eclipse открыты для взносов. Если вам нравится библиотека, вы можете сообщить нам об этом, отметив ее на GitHub.