java8 sum_lambda – Java 8流由3个字段组合并按sum和count聚合产生单行输出

前提

class Product {

public String name;

public String category;

public String type;

public int id;

//todo:implement equals(), toString() and hashCode()

}

class Item{

public Product product;

public double cost;

}

总结方式

List items = ...;

Map stat = items.stream().collect(groupingBy(

it -> it.product,

Collectors.summarizingDouble(it -> it.cost)

));

// get some product summarizing

long count = stat.get(product).getCount();

double sum = stat.get(product).getSum();

//list all product summarizing

stat.entrySet().forEach(it ->

System.out.println(String.format("%s - count: %d, total cost: %.2f"

, it.getKey(),it.getValue().getCount(), it.getValue().getSum()));

);

合并具有相同产品的项目

首先,您需要在Item类中添加一个qty字段:

class Item{

public int qty;

//other fields will be omitted

public Item add(Item that) {

if (!Objects.equals(this.product, that.product)) {

throw new IllegalArgumentException("Can't be added items"

+" with diff products!");

}

return from(product, this.cost + that.cost, this.qty + that.qty);

}

private static Item from(Product product, double cost, int qty) {

Item it = new Item();

it.product = product;

it.cost = cost;

it.qty = qty;

return it;

}

}

那么您可以使用Collectors#toMap合并具有相同产品的项目:

Collection summarized = items.stream().collect(Collectors.toMap(

it -> it.product,

Function.identity(),

Item::add

)).values();

最后

你可以看到两种方式做同样的事情,但第二种方法更容易在流上运行.以及我在github上检查的两种方式的测试,你可以点击查看更多细节:summarizing items& merge items方式.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值