Java8 | Как использовать агрегацию Group By для управления данными коллекции?

Java задняя часть
Java8 | Как использовать агрегацию Group By для управления данными коллекции?

Это 19-й день моего участия в ноябрьском испытании обновлений.Подробности о событии:Вызов последнего обновления 2021 г.

🤞 Персональная домашняя страница:@青城Sequencer Stone
🤞 Преимущества вентилятора:Добавить фан-базуОтвечайте на вопросы один на один, получайте бесплатные шаблоны резюме, улучшайте учебные материалы и т. д. и станьте королем новой эры!

над《Java8 | Как изящно инициализировать Map и List2Map? 》Когда дело доходит до инициализации Map и List2Map, многие небольшие партнеры выдвинули множество отличных предложений. В этой статье рассматривается групповая обработка агрегированных данных, которые, вероятно, будут использоваться в фактической разработке, и рассматриваются различные методы решения проблем.

1. Проблемы развития

Группировка данных коллекции довольно распространена в реальном процессе разработки, например, данные о продукте, передаваемые во внешний интерфейс, группируются по типу. Наиболее распространенный способ — просмотреть всю коллекцию, а затем создать коллекцию различных типов, оценивая тип. Так есть ли лучший способ,Java8 groupingByможет помочь нам.

Так же, Если у нас есть классProduct, как показано в коде ниже.

@Getter
@Setter
@ToString
@Builder
class Product{
    private Long id;
    private String category;
    private String name;
    private int count;
}

у нас есть сейчасList<Product>форматировать данные.

static List<Product> getList(){
    final List<Product> productList = new ArrayList<>(100);
    for(int i =1;i<=100;i++){
        productList.add(Product.builder()
            .id((long) i)
            .name("name"+i)
            .category("category"+i%9)
            .count(i)
            .build());
    }
    return productList;
}

Затем мы выполняем сложную обработку этих данных.

Во-вторых, простейшая одноколоночная обработка

согласно сcategoryТипы сгруппированы.

final Map<String, List<Product>> maps = productList.stream()
    .collect(Collectors.groupingBy(Product::getCategory));

здесь дляCollectors.groupingByпараметрыFunction<? super T, ? extends K> classifierВозвращаемое значение как ключ .

3. После группировки посчитайте общее количество указанных столбцов

согласно сcategoryТипы сгруппированы и подсчитаны для каждого типаcountВсего.

Map<String, Integer> maps = productList.stream()
        .collect(Collectors.groupingBy(Product::getCategory, summingInt(Product::getCount)));

Следуйте приведенному выше коду, чтобы получить сумму из сгруппированных результатов. Выше приведена операция агрегирования. Что делать, если вы хотите выполнить операцию фильтрации, например, просмотреть продукты с наибольшим количеством в группе типов?
использоватьmaxBy(comparingInt(*))Вот и все.

Map<String, Optional<Product>> maps = productList.stream()
        .collect(Collectors.groupingBy(Product::getCategory, maxBy(comparingInt(Product::getCount))));

Использование этих существующих методов JDK для преобразования форматов данных в памяти может значительно повысить эффективность разработки.


Мальчик, ты не можешь видеть достаточно? нажмите на каменьПодробное описание, Просто нажмите и посмотрите, может быть, будут сюрпризы? Добро пожаловать в поддержкуНравится/Подписывайтесь/Комментируйте, ваша поддержка — моя самая большая мотивация для Gengwen, спасибо!