Java8-根据List对象某个字段分组并对相关字段进行计算

Java8-根据List对象某个字段分组并对相关字段进行计算

1.老夫有个对象,有如下字段

@Data
public class Activity implements Serializable {
   
   

    private static final long serialVersionUID = 7353320757077145027L;

    private Long id;

    /**
     * 活动ID
     */
    private Long activityId;

    /**
     * pv数
     */
    private Long pv;

    /**
     * 奖品放数
     */
    private Long prizeCount;

    /**
     * 创建时间
     */
    private Data createTime;

}

需求:根据活动ID进行分组后,统计pv和prizeCount。

2.老夫接到需求后二话不说就开干。先定义一个方法,如下:

/**
     * 1.根据传入的数据集与指定的分组字段进行分组
     * 2.分组完成后对指定的字段进行计算
     * 3.返回一个新的数据集
     *
     * @param dataList  需要分组的数据集合
     * @param groupFunc 分组字段
     * @return List<Activity>
     */
    private List<Activity> groupMergeToList(List<Activity> dataList, Function<Activity, ?> groupFunc) {
   
   
        return dataList.<
列表根据对象某个字段进行分组,在不同的编程语言中有不同的实现方法,以下是几种常见语言的示例: ### Java 可以使用 Java 8 的 Stream API 实现。以`List<SkyCashRate>`根据`seclineName`字段分组为例: ```java import java.util.*; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; class SkyCashRate { private String seclineName; public SkyCashRate(String seclineName) { this.seclineName = seclineName; } public String getSeclineName() { return seclineName; } } public class GroupByExample { public static void main(String[] args) { List<SkyCashRate> list = new ArrayList<>(); list.add(new SkyCashRate("A")); list.add(new SkyCashRate("B")); list.add(new SkyCashRate(null)); Map<String, List<SkyCashRate>> seclineMap = list.stream() .collect(Collectors.groupingBy(m -> StringUtils.isEmpty(m.getSeclineName()) ? "其他" : m.getSeclineName(), Collectors.toList())); System.out.println(seclineMap); } } ``` 若要分组后对相关字段进行计算,以`List<Activity>`为例: ```java import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; class Activity { private int pv; private int prizeCount; public Activity() { } public Activity(int pv, int prizeCount) { this.pv = pv; this.prizeCount = prizeCount; } public int getPv() { return pv; } public void setPv(int pv) { this.pv = pv; } public int getPrizeCount() { return prizeCount; } public void setPrizeCount(int prizeCount) { this.prizeCount = prizeCount; } } public class GroupAndCalculate { private static List<Activity> groupMergeToList(List<Activity> dataList, Function<Activity, ?> groupFunc) { return dataList.stream() .collect(Collectors.groupingBy(groupFunc)) .values() .stream() .flatMap(list -> Stream.of(list.stream() .reduce((data1, data2) -> { data1.setPv(data1.getPv() + data2.getPv()); data1.setPrizeCount(data1.getPrizeCount() + data2.getPrizeCount()); return data1; }) .orElse(new Activity()))) .collect(Collectors.toList()); } public static void main(String[] args) { List<Activity> activities = Arrays.asList( new Activity(10, 2), new Activity(20, 3), new Activity(10, 2) ); List<Activity> result = groupMergeToList(activities, activity -> activity.getPv()); System.out.println(result); } } ``` ### JavaScript 可以使用`for`循环实现对象数组基于某个字段分组,以根据`gender`字段分组为例: ```javascript const obj = [ { name: '谢广坤', gender: 'male' }, { name: '赵四', gender: 'male' }, { name: '刘能', gender: 'male' }, { name: '王小蒙', gender: 'female' } ]; type stringKey = Record<string, any[]>; const result: stringKey = {}; const apartGroup = () => { for (let i = 0; i < obj.length; i++) { const key = obj[i].gender; if (result[key]) { result[key].push(obj[i]); } else { result[key] = [obj[i]]; } } console.log('result', result); return result; }; apartGroup(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值