最近接到一个比较复杂的数据统计需求,对查出来的数据进行分组统计,当时脑海就浮现出,数据统计?这不就是lambda的特长嘛!但是在实现的过程中发现,处理起来还挺头疼的,还好最后是搞出来了,下面贴上主要的示例代码,希望能帮到碰到类似问题的同行们。
温馨提示:请自行先引入lombok 依赖噢~
import lombok.*;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Test {
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
static class ActivityRecord {
private String id;
private String mobile;
/**
* 投入金额
*/
private BigDecimal amount;
/**
* 赢得金额
*/
private BigDecimal winAmount;
/**
* 是否中奖。中奖则为1,不中则为0,这样可以统计中奖次数
*/
private Integer winCount;
public ActivityRecord(BigDecimal amount, BigDecimal winAmount, Integer winCount) {
this.amount = amount;
this.winAmount = winAmount;
this.winCount = winCount;
}
}
public static void main(String[] args) {
List<ActivityRecord> list = Arrays.asList(new ActivityRecord("111", "13588889999"
, new BigDecimal("100"), new BigDecimal("110"), 1)
, new ActivityRecord("112", "13760606060"
, new BigDecimal("200"), new BigDecimal("220"), 1)
, new ActivityRecord("113", "13944442222"
, new BigDecimal("100"), new BigDecimal("0"), 0)
, new ActivityRecord("114", "13760606060"
, new BigDecimal("100"), new BigDecimal("110"), 1)
, new ActivityRecord("115", "13588889999"
, new BigDecimal("100"), new BigDecimal("0"), 0)
);
Map<String, ActivityRecord> collect =
list.parallelStream().collect(Collectors.groupingBy(ActivityRecord::getMobile
, Collectors.collectingAndThen(Collectors.toList(), m -> {
BigDecimal amount = m.parallelStream().map(ActivityRecord::getAmount).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal winAmount = m.parallelStream().map(ActivityRecord::getWinAmount).reduce(BigDecimal.ZERO,BigDecimal::add);
Integer winCount = m.parallelStream().mapToInt(ActivityRecord::getWinCount).sum();
return new ActivityRecord(amount, winAmount, winCount);
})));
System.out.println("collect = " + collect);
}
}
运行结果:
collect = {13944442222=Test.ActivityRecord(id=null, mobile=null, amount=100, winAmount=0, winCount=0), 13588889999=Test.ActivityRecord(id=null, mobile=null, amount=200, winAmount=110, winCount=1), 13760606060=Test.ActivityRecord(id=null, mobile=null, amount=300, winAmount=330, winCount=2)}
刚好结果是我想要的!
学无止境,生生不息!