Stream分组

一、Stream分组求和


/**
 * 求和
 */
public void sum(){
    List dataList = getDataList();
    Map<String, Double> map = dataList.stream().collect(Collectors.groupingBy(Data::getType, Collectors.summingDouble(Data::getValue)));
}

Stream分组求和可以用来对List进行分组后求和操作,例如对于以下数据:


List<Data> dataList = Arrays.asList(
        new Data("A", 1),
        new Data("B", 2),
        new Data("A", 3),
        new Data("B", 4),
        new Data("C", 5)
);

按照Data对象的type属性进行分组,再对value属性求和,可以得到如下结果:


Map<String, Double> result = {
    "A": 4.0,
    "B": 6.0,
    "C": 5.0
}

二、Stream分组前十


/**
 * 分组前十
 */
public void top(){
    List dataList = getDataList();
    Map<String, List<Data>> groups = dataList.stream().collect(Collectors.groupingBy(Data::getType));
    Map<String, List<Data>> result = new HashMap<>();
    groups.forEach((k, v) -> {
        List<Data> top = v.stream()
            .sorted(Comparator.comparing(Data::getValue).reversed())
            .limit(10)
            .collect(Collectors.toList());
        result.put(k, top);
    });
}

Stream分组前十可以用来对List进行分组后取出每组的前十个数据,例如对于以下数据:


List<Data> dataList = Arrays.asList(
        new Data("A", 1),
        new Data("B", 2),
        new Data("A", 3),
        new Data("B", 4),
        new Data("C", 5)
);

按照Data对象的type属性进行分组,再对value属性进行降序排序,取出前十个数据,可以得到如下结果:


Map<String, List<Data>> result = {
    "A": [{type: "A", value: 3}, {type: "A", value: 1}],
    "B": [{type: "B", value: 4}, {type: "B", value: 2}],
    "C": [{type: "C", value: 5}]
}

三、Stream分组拼接


/**
 * 字符串拼接
 */
public void join(){
    List<Data> dataList = getDataList();
    Map<String, String> result = dataList.stream().collect(Collectors.groupingBy(Data::getType, Collectors.mapping(Data::getName, Collectors.joining(","))));
}

Stream分组拼接可以用来对List进行分组后将某个属性值拼接成一个字符串,例如对于以下数据:


List<Data> dataList = Arrays.asList(
        new Data("A", 1, "A1"),
        new Data("B", 2, "B1"),
        new Data("A", 3, "A2"),
        new Data("B", 4, "B2"),
        new Data("C", 5, "C1")
);

按照Data对象的type属性进行分组,再对name属性进行拼接,可以得到如下结果:


Map<String, String> result = {
    "A": "A1,A2",
    "B": "B1,B2",
    "C": "C1"
}

四、Map转List Stream


/**
 * Map转List
 */
public void mapToList(){
    Map<String, List<Data>> map = getMap();
    List<Data> result = map.entrySet()
        .stream()
        .flatMap(entry -> entry.getValue().stream().peek(data -> data.setType(entry.getKey())))
        .collect(Collectors.toList());
}

Map转List Stream可以用来将Map转换为List,同时给List添加一些额外的属性,例如对于以下数据:


Map<String, List<Data>> map = {
    "A": [{value: 1}, {value: 2}],
    "B": [{value: 3}, {value: 4}]
}

将Map转换为List,并且在List中添加type属性,可以得到如下结果:


List<Data> result = [{type: "A", value: 1}, {type: "A", value: 2}, {type: "B", value: 3}, {type: "B", value: 4}]

五、Stream分组List


/**
 * 分组List
 */
public void groupList(){
    List<Data> dataList = getDataList();
    Map<String, List<Data>> result = dataList.stream().collect(Collectors.groupingBy(Data::getType));
}

Stream分组List可以用来对List进行分组操作,例如对于以下数据:


List<Data> dataList = Arrays.asList(
        new Data("A", 1),
        new Data("B", 2),
        new Data("A", 3),
        new Data("B", 4),
        new Data("C", 5)
);

按照Data对象的type属性进行分组,可以得到如下结果:


Map<String, List<Data>> result = {
    "A": [{type: "A", value: 1}, {type: "A", value: 3}],
    "B": [{type: "B", value: 2}, {type: "B", value: 4}],
    "C": [{type: "C", value: 5}]
}

六、Stream分组并排序


/**
 * 分组排序
 */
public void sort(){
    List<Data> dataList = getDataList();
    Map<String, List<Data>> result = dataList.stream()
        .collect(Collectors.groupingBy(Data::getType, Collectors.collectingAndThen(Collectors.toList(), list -> {
            list.sort(Comparator.comparingDouble(Data::getValue));
            return list;
        })));
}

Stream分组并排序可以用来对List进行分组后再按照某个属性进行排序,例如对于以下数据:


List<Data> dataList = Arrays.asList(
        new Data("A", 1),
        new Data("B", 2),
        new Data("A", 3),
        new Data("B", 4),
        new Data("C", 5)
);

按照Data对象的type属性进行分组,再按照value属性进行升序排序,可以得到如下结果:


Map<String, List<Data>> result = {
    "A": [{type: "A", value: 1}, {type: "A", value: 3}],
    "B": [{type: "B", value: 2}, {type: "B", value: 4}],
    "C": [{type: "C", value: 5}]
}

七、Stream分组计数


/**
 * 统计数量
 */
public void count(){
    List<Data> dataList = getDataList();
    Map<String, Long> result = dataList.stream().collect(Collectors.groupingBy(Data::getType, Collectors.counting()));
}

Stream分组计数可以用来对List进行分组后统计每组数量,例如对于以下数据:


List<Data> dataList = Arrays.asList(
        new Data("A", 1),
        new Data("B", 2),
        new Data("A", 3),
        new Data("B", 4),
        new Data("C", 5)
);

按照Data对象的type属性进行分组,统计每组数据的数量,可以得到如下结果:


Map<String, Long> result = {
    "A": 2,
    "B": 2,
    "C": 1
}

八、Stream分组统计数量


/**
 * 统计数量
 */
public void count(){
    List<Data> dataList = getDataList();
    Map<String, Integer> result = dataList.stream()
        .collect(Collectors.groupingBy(Data::getType, Collectors.summingInt(Data::getValue)));
}

Stream分组统计数量可以用来对List进行分组后统计每组数据的数量并且可以针对每个数量属性进行求和,例如对于以下数据:


List<Data> dataList = Arrays.asList(
        new Data("A", 1),
        new Data("B", 2),
        new Data("A", 3),
        new Data("B", 4),
        new Data("C", 5)
);

按照Data对象的type属性进行分组,统计每组数据的数量并且对value属性求和,可以得到如下结果:


Map<String, Integer> result = {
    "A": 4,
    "B": 6,
    "C": 5
}

九、Stream分组求和BigDecimal


/**
 * BigDecimal求和
 */
public void bigDecimalSumming(){
    List<Data> dataList = getDataList();
    Map<String, BigDecimal> result = dataList.stream()
            .collect(Collectors.groupingBy(Data::getType, Collectors.mapping(Data::getValue, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
}

Stream分组求和BigDecimal可以用来对List进行分组后对某个BigDecimal属性进行求和,例如对于以下数据:


List<Data> dataList = Arrays.asList(
        new Data("A", new BigDecimal(1)),
        new Data("B", new BigDecimal(2)),
        new Data("A", new BigDecimal(3)),
        new Data("B", new BigDecimal(4)),
        new Data("C", new BigDecimal(5))
);

按照Data对象的type属性进行分组,再对value属性进行BigDecimal求和,可以得到如下结果:


Map<String, BigDecimal> result = {
    "A": new BigDecimal(4),
    "B": new BigDecimal(6),
    "C": new BigDecimal(5)
}

十、Stream分组后对List处理选取


/**
 * 分组取值
 */
public void groupSample(){
    List<Data> dataList = getDataList();
    int size = 2;
    Map<String, List<String>> result = dataList.stream().collect(Collectors.groupingBy(Data::getType, Collectors.collectingAndThen(Collectors.toList(), list -> {
        Collections.shuffle(list);
        return list.stream().limit(size).map(Data::getName).collect(Collectors.toList());
    })));
}

Stream分组后对List处理选取可以用来对List进行分组后从每组中随机选取一些数据,例如对于以下数据:


List<Data> dataList = Arrays.asList(
        new Data("A", 1, "A1"),
        new Data("B", 2, "B1"),
        new Data("A", 3, "A2"),
        new Data("B", 4, "B2"),
        new Data("C", 5)
);

按照Data对象的type属性进行分组,再对List进行随机排序后选取前2个,可以得到如下结果:


Map<String, List<String>> result = {
    "A": ["A2", "A1"],
    "B": ["B2", "B1"],
    "C": ["C1"]
}

原创文章,作者:VWVW,如若转载,请注明出处:https://www.506064.com/n/135937.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VWVWVWVW
上一篇 2024-10-04 00:15
下一篇 2024-10-04 00:15

相关推荐

  • 如何使用integratecustomerdata.stream().filter(c->{ if (collectionutil.isnotempty(

    本文将详细介绍如何在Java编程中使用integratecustomerdata.stream().filter(c->{ if (collectionutil.isnote…

    编程 2025-04-28
  • C++ Stream详解

    一、从C Stream读取 C Stream是C语言中进行标准输入输出操作的方式。C++在继承C语言的同时也继承了这种方式,通过使用C Stream,我们可以向同一个设备中进行不同…

    编程 2025-04-25
  • Stream去重的完全指南

    一、Stream去重的介绍 在Java 8以后,引入了一个非常强大的流处理(Stream)库,其中一个流操作是去重。Stream去重是一种便捷的方法,用于删除集合中的重复元素并返回…

    编程 2025-04-23
  • Java Stream Collect详解

    一、Collect的简介 Collect是Java 8 Stream API中一种非常实用的终止操作,可以将Stream中的数据转化为特定的容器(Collection)或 Map对…

    编程 2025-04-20
  • Java Stream去重详解

    Stream是Java 8引入的一款新特性,它支持函数式编程,可以使用Lambda表达式来对集合进行操作,使代码更简洁、优雅。而去重是Stream中常见的操作之一,那么Stream…

    编程 2025-04-12
  • Java Stream转换Map

    一、介绍 Java 8中引入了Stream API,提供了丰富的功能,方便我们对集合进行各种操作,其中一个非常常见的操作就是将Stream转换为一个Map。 二、Stream转换为…

    编程 2025-04-12
  • 深入了解Java 8 Stream中的groupby方法

    Java 8 引入的 Stream API 对于集合的操作提供了一种新的方式,包括筛选,分组和映射等。Stream API 中的 groupby 方法可以将一个 Stream 中的…

    编程 2025-02-25
  • 深入了解nginx stream配置

    一、stream配置简介 stream模块是nginx中一个支持TCP/UDP协议的模块。使用stream模块,可以在同一台服务器上运行多个不同的网络流应用程序。这些应用程序使用不…

    编程 2025-02-05
  • Stream累加

    一、什么是Stream累加 Stream累加指的是在Java 8中,对Stream进行操作,对Stream中的元素进行累加求和的操作。Stream是Java 8中为了方便操作集合类…

    编程 2025-02-05
  • Stream平台全方位解析

    一、什么是Stream平台? Stream是一款基于云计算架构的、面向海量实时流数据处理的大数据平台,它提供了一套完整的流式大数据解决方案,包括数据采集、实时流处理、数据存储、数据…

    编程 2025-02-01

发表回复

登录后才能评论