Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算映射的映射内列表的总和_Java_Java 8 - Fatal编程技术网

Java 计算映射的映射内列表的总和

Java 计算映射的映射内列表的总和,java,java-8,Java,Java 8,我有一份交易清单,是一张按地区和状态分组的地图。交易类有一个属性amount字段 Map<Region, Map<Status, List<Trade>>> groupedTrades class Trade { double amount; } 我想在列表中对交易金额进行分组,并按如下方式返回 Map<Region, Map<Status, Double>> sumOfGroupedTradeAmounts Double是交

我有一份交易清单,是一张按地区和状态分组的地图。交易类有一个属性amount字段

Map<Region, Map<Status, List<Trade>>> groupedTrades

class Trade {
  double amount;
}
我想在列表中对交易金额进行分组,并按如下方式返回

Map<Region, Map<Status, Double>> sumOfGroupedTradeAmounts
Double是交易列表中所有金额字段的总和


在java8中如何实现这一点?

仅使用流,它可能如下所示:

Map<Region, Map<Status, Double>> result =
    groupedTrades
        .entrySet()
        .stream()
        .collect(Collectors.toMap(
                 Map.Entry::getKey, // Leave key as is
                 entry -> mapToDouble(entry.getValue(), MyClass::sumOfTrades))); // applies sumOfTrades (See below)

你可以这样做。基本上,你是:

对入口集执行嵌套流式处理。 流式处理外部映射条目以获取内部映射值和外部映射键。 在内部条目集中,对值进行流式处理,该值是列表并对其求和。 然后在指定的映射中使用外部映射键、内部映射键和交易金额的总和返回这些值,从而得到一个双倍值。 注意,我为交易类添加了一个getter,用于金额检索

class Trade {
    double amount;
    
    public double getAmount() {
        return amount;
    }
}
    
public static void main(String[] args) {
    Map<Region, Map<Status, Double>> result = groupedTrades
            .entrySet().stream()

            // outer map starts here, keying on Region
            .collect(Collectors.toMap(Entry::getKey, e -> e
                    .getValue().entrySet().stream()

                     // inner map starts here, keying on Status
                    .collect(Collectors.toMap(Entry::getKey,

                           // stream the list and sum the amounts.
                            ee -> ee.getValue().stream()
                                    .mapToDouble(Trade::getAmount)
                                    .sum()))));
    
}
下面是示例输出

2
     B -> 18.0
     A -> 12.0
1
     B -> 3.0
     A -> 60.0
如果您对求和所有值感兴趣。通过使用刚刚创建的双精度嵌套贴图,可以按如下方式执行

double allSums =
         // Stream the inner maps 
         result.values().stream()
         // put all the Doubles in a single stream
        .flatMap(m->m.values().stream())
         // unbox the Doubles to primitive doubles
        .mapToDouble(Double::doubleValue)
         // and sum them
        .sum();

到目前为止您尝试了什么?Map sumOfGroupedTradeAmounts=groupedTrades.entrySet.stream.collectCollectors.toMapMap.Entry::getKey,e->calcTotale.getValue;我可以用一个map来完成它,我不知道当我有一个map的map时如何让它工作。一种方法可以嵌套到map中,然后在值中求和,比如groupedTrades.entrySet.stream.collectCollectors.toMapMap.Entry::getKey,e->e.getValue.entrySet.stream.collectCollectors.toMapMap.Entry::getKey,t->t.getValue.stream.mapToDoublei->i.getAmount.sum;在帖子中而不是在评论中添加您尝试过的代码。
Map<Region, Map<Status, List<Trade>>> groupedTrades = Map.of(   
        new Region(1),                                          
        Map.of(new Status("A"),                                 
                List.of(new Trade(10), new Trade(20),           
                        new Trade(30)),                         
                new Status("B"),                                
                List.of(new Trade(1), new Trade(2))),           
        new Region(2),                                          
        Map.of(new Status("A"),                                 
                List.of(new Trade(2), new Trade(4),             
                        new Trade(6)),                          
                new Status("B"), List.of(new Trade(3),          
                        new Trade(6), new Trade(9))));

result.forEach((k, v) -> {                           
    System.out.println(k);                           
    v.forEach((kk, vv) -> System.out                 
            .println("     " + kk + " -> " + vv));   
});                                                            
2
     B -> 18.0
     A -> 12.0
1
     B -> 3.0
     A -> 60.0
double allSums =
         // Stream the inner maps 
         result.values().stream()
         // put all the Doubles in a single stream
        .flatMap(m->m.values().stream())
         // unbox the Doubles to primitive doubles
        .mapToDouble(Double::doubleValue)
         // and sum them
        .sum();