经常使用到User类,根据多个字段进行汇总,汇总后求和某个字段或多个字段,第一想法可能会使用多次的循环进行处理,再次求和,那么Steam中能不能进行汇总呢?

主要用于记录类似场景

package com.ruoyi.system.service.impl;

import java.util.Arrays;
import java.util.Objects;

public class GroupingUtils {

    /**
     * 生成复合键
     *
     * @param fields 多个字段
     * @return 复合键
     */
    public static Object createCompositeKey(Object... fields) {
        return Arrays.toString(fields);
    }

    /**
     * 生成复合键的哈希码
     *
     * @param key 复合键
     * @return 哈希码
     */
    public static int hashOf(Object key) {
        return Objects.hash(key);
    }

    /**
     * 判断两个复合键是否相等
     *
     * @param key1 第一个复合键
     * @param key2 第二个复合键
     * @return 是否相等
     */
    public static boolean equals(Object key1, Object key2) {
        return Objects.equals(key1, key2);
    }
}

public static void main(String[] args) {
        User user = new User("张三", 18, 0, "山东省青岛市", 0L, NumberUtil.toBigDecimal("100"));
        User user1 = new User("李四", 18, 1, "山东省泰安市", 13355322456L, NumberUtil.toBigDecimal("200"));
        User user2 = new User("张三", 18, 1, "山东省青岛市", 13355322456L, NumberUtil.toBigDecimal("150"));
        List<User> list = new ArrayList<>();
        list.add(user);
        list.add(user1);
        list.add(user2);

        Map<Object, User> groupedUsers = list.stream()
                .collect(Collectors.groupingByConcurrent(
                        item -> GroupingUtils.createCompositeKey(item.getUserName(), item.getAge(), item.getAddress()),
                        Collectors.collectingAndThen(
                                Collectors.reducing((u1, u2) -> new User(
                                        u1.getUserName(),
                                        u1.getAge(),
                                        u1.getGender(),
                                        u1.getAddress(),
                                        u1.getPhoneNumber(),
                                        u1.getPrice().add(u2.getPrice())
                                )),
                                optionalUser -> optionalUser.orElse(new User("", 0, 0, "", 0L, BigDecimal.ZERO))
                        )
                ));

        groupedUsers.forEach((k, v) -> System.out.println("复合键: " + k + "  用户名: " + v.getUserName() + "  年龄: " + v.getAge() + "  性别: " + v.getGender() + "  地址: " + v.getAddress() + "  电话: " + v.getPhoneNumber() + "  总金额: " + v.getPrice()));
    }
class User{
    private String userName;
    private int age;
    private int gender;
    private String address;
    private Long phoneNumber;
    private BigDecimal price;

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                ", address='" + address + '\'' +
                ", phoneNumber=" + phoneNumber +
                ", price=" + price +
                '}';
    }

    public User() {
    }

    public User(String userName, int age, int gender, String address, Long phoneNumber, BigDecimal price) {
        this.userName = userName;
        this.age = age;
        this.gender = gender;
        this.address = address;
        this.phoneNumber = phoneNumber;
        this.price = price;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getGender() {
        return gender;
    }

    public void setGender(int gender) {
        this.gender = gender;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Long getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(Long phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public BigDecimal getPrice() {
        return price;
    }

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

文章作者: 烦恼的夏洛克
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 烦恼的夏洛克
Java Java
喜欢就支持一下吧