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/zh-tw/n/135937.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VWVW的頭像VWVW
上一篇 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

發表回復

登錄後才能評論