如何使用上流
问题描述:
分组,骨料,变换和滤波假设TXN,其中每个TXN具有以下字段如何使用上流
的流{日期,AMT,姓名,商家}
给出TXN流
组由YYYY- mm // fold 1
组内(yyyy-mm);地图到新对象费用(收入,略去)
如果量> 0,则收入+ = AMT //条件倍2.A
如果量< 0然后花+ = AMT //条件倍2.B
想知道在java中实现上面的方法是什么? 下面尝试,它属于程短
txns
.stream()
.collect(
Collectors.groupingBy(
Txn::getYearMonth,
Collectors.mapping(
getExpense,
Collectors.toList())));
getexpense是函数映射我写的改造事务处理到消费对象。
答
我认为你被困在聚合步骤。您发布将导致该代码:
Map<YearMonth, List<Expense>>
虽然我猜你想:
Map<YearMonth, Expense> // transactions aggregated into a single Expense
为了做到这一点,你需要创建一个可以聚集Expense
对象的收集。
它应该是这样的:
Collector.of(
Expense::new,
(Expense e, Transaction t) -> e.add(t),
(e1, e2) -> new Expense(e1, e2)
);
你的消费类将需要:
- 一个公共的空构造
- 一个构造函数2项开支,并创建一个新的聚集费用
- 和
add
方法将Transaction
添加到Expense
事情是这样的:
public class Expense {
private double income;
private double spent;
public Expense() {
}
public Expense(Expense e1, Expense e2) {
this.income = e1.income + e2.income;
this.spent = e1.spent + e2.spent;
}
public void add(Transaction t) {
this.income += t.getAmount() > 0 ? t.getAmount() : 0;
this.spent += t.getAmount() < 0 ? t.getAmount() : 0;
}
}
然后,您可以在groupingBy使用Collector
:
groupingBy(Txn::getYearMonth, myCollector)
而结果将在一个Expense
对象进行汇总费用。
更新
所以这样的:
Collector<Transaction, Expense, Expense> c = Collector.of(
Expense::new,
(Expense e, Transaction t) -> e.add(t),
(e1, e2) -> new Expense(e1, e2)
);
Map<YearMonth, Expense> collect = txns.stream()
.collect(Collectors.groupingBy(Transaction::getYearMonth, c));
üculd帮我确定myCollector – bajju
我想,交易金额应加'income'或'spent'而不是覆盖它... – Holger
是啊,似乎我错过了,更新它 – john16384