jdk1.8:stream流式分组groupby

复制代码
package com.example.apidemo.jdk18;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.tuple.MutablePair;

/**
 * @Author Tim
 * @Date 2021/12/17 16:24
 */
public class GroupBy {

    public static void main(String[] args) {

        //Java 8允许在接口中加入具体方法。接口中的具体方法有两种,default方法和static方法,identity()就是Function接口的一个静态方法。
        //Function.identity()返回一个输出跟输入一样的Lambda表达式对象,等价于形如t -> t形式的Lambda表达式

        //按输入类型,统计分组数量
        List<String> items = Arrays.asList("apple", "apple", "banana","apple", "orange", "banana", "papaya");
        Map<String, Long> result = items.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        System.out.println("result===" +result);

        //按输入类型,统计分组--排序
        Map<String, List<String>> result2 = items.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.toList()));
        System.out.println("result2===" +result2);

        // result 排序
        Map<String, Long> finalMap = new LinkedHashMap<>();
        result.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByValue().reversed())
            .forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));
        System.out.println("finalMap===" + finalMap);


        List<User> users = Arrays.asList(
            new User("apple", 10, new BigDecimal(23)),
            new User("apple", 20, new BigDecimal(32)),

            new User("orange", 30, new BigDecimal(13)),
            new User("orange", 20, new BigDecimal(33)),
            new User("orange", 10, new BigDecimal(63)),

            new User("peach", 20, new BigDecimal(26)),
            new User("peach", 30, new BigDecimal(42)),
            new User("peach", 40, new BigDecimal(24)),
            new User("peach", 10, new BigDecimal(12))
        );

        // 按照name分组,并求出个数
        Map<String, Long> counting = users.stream().collect(Collectors.groupingBy(User::getName, Collectors.counting()));
        System.out.println("counting===="+counting);

        // 按照name分组,求和
        Map<String, Integer> sum = users.stream().collect(Collectors.groupingBy(User::getName, Collectors.summingInt(User::getQty)));
        System.out.println("sum===="+sum);

        int basePoint3 = users.stream().filter(user -> user.getName().equals("orange")).mapToInt(User::getQty).sum();
        System.out.println("basePoint3===="+ basePoint3);

        System.out.println("=================================================================");

        // 按照name分组 转化List->Set,并且只取 getName作为新的list。
        Map<Integer, List<String>> result_list = users.stream()
            .collect(Collectors.groupingBy(User::getQty, Collectors.mapping(User::getName, Collectors.toList())));
        System.out.println("result_list===="+ result_list);

        Map<String, Set<User>> result_set = users.stream()
            .collect(Collectors.groupingBy(User::getName, Collectors.toSet()));
        System.out.println("result_set===="+ result_set);

        //按照name分组,可以简写,不需要,Collectors.toList()
        Map<String, List<User>> groupByPriceMap = users.stream().collect(Collectors.groupingBy(User::getName));
        System.out.println("groupByPriceMap===="+ groupByPriceMap);
    }

}
复制代码

 

复制代码
package com.example.apidemo.jdk18;

import java.math.BigDecimal;

public class User {

    private String name;

    private int qty;

    private BigDecimal price;

    public User() {
    }

    public User(String name, int qty, BigDecimal price) {
        this.name = name;
        this.qty = qty;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getQty() {
        return qty;
    }

    public void setQty(int qty) {
        this.qty = qty;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Item{" +
                "name='" + name + '\'' +
                ", qty=" + qty +
                ", price=" + price +
                '}';
    }
}
复制代码

 

posted @   威兰达  阅读(5655)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示