Java复合键汇总求和
经常使用到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 许可协议。转载请注明来自
烦恼的夏洛克!
喜欢就支持一下吧