Узнайте, как использовать метод 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, рассмотренные в примерах

  1. countBy - Подсчитывает элементы Collection по заданному Function и возвращает Сумку.
  2. Bags.immutable.with - создает ImmutableBag с указанными элементами vararg’d. В Eclipse Collections есть изменяемые и неизменяемые Collection фабрики.
  3. occurrencesOf - возвращает количество от Bag для определенного элемента.
  4. topOccurrences - возвращает List элементов и их количество в порядке убывания по количеству вхождений.

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

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