如何使用上流

问题描述:

分组,骨料,变换和滤波假设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) 
); 

你的消费类将需要:

  1. 一个公共的空构造
  2. 一个构造函数2项开支,并创建一个新的聚集费用
  3. 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)); 
+0

üculd帮我确定myCollector – bajju

+0

我想,交易金额应加'income'或'spent'而不是覆盖它... – Holger

+0

是啊,似乎我错过了,更新它 – john16384