Java 8+流-从包含其他Map的Map〈String,Object>到对象总数

w6lpcovy  于 2023-03-06  发布在  Java
关注(0)|答案(4)|浏览(189)

我想问一个关于流的问题,我有一个class C的列表,结构如下:

list<C> listC 

class C {
  Map<String, ClassB>
}
classB {
  Map<String, ClassA>
}
classA {
 int value;
}

int sumOfValues = ?

我的目标是了解获得所有值之和的最佳方法,即使用流迭代Map。
我知道如何使用普通循环或forEach结构来执行此操作,但我不完全确定如何通过流来最好地执行此操作。
我试过这样的方法:

listC.stream().map(C::getMap).collect(Collectors.toList()).stream()
                    .map(m -> m.values().stream().collect(Collectors.toList()))

但我不认为这是正确的道路...
有人能帮助我理解迭代Map结构列表的最佳方法吗?非常感谢

enyaitl3

enyaitl31#

在我看来,您正在寻找Stream.flatMap():
返回一个流,该流由将此流的每个元素替换为Map流的内容的结果组成,该Map流是通过将提供的Map函数应用于每个元素而生成的。
flatMap()操作的作用是将一对多转换应用于流的元素,然后将生成的元素扁平化为新的流。
示例:

int sum = list.stream()
            .flatMap(c -> c.getMap().values().stream()) //map to stream of B's
            .flatMap(b -> b.getMap().values().stream()) //map to stream of A's
            .mapToInt(A::getValue) //map to IntStream of the values
            .sum();
efzxgjgh

efzxgjgh2#

你可以这样试试:

static class ClassC {
  Map<String, ClassB> content;
}
static class ClassB {
  Map<String, ClassA> content;
}
static class ClassA {
 int value;
}

public static void main (String[] args){

    List<ClassC> listC = null; // needs to be initialized properly

    int sumOfValues = listC.stream().flatMap(c -> c.content.values().stream()).flatMap(b -> b.content.values().stream()).mapToInt(a -> a.value).sum();
}
eufgjt7s

eufgjt7s3#

正如其他人所建议的,我们可以使用flatMap并以一种简单的方式解决这个问题。

int sumOfValues = listC.stream() // Stream<C>
            .flatMap(c -> c.map.values().stream()) // Stream<B>
            .flatMap(b -> b.map.values().stream()) // Stream<A>
            .mapToInt(a -> a.value) // stream of map to IntStream 
            .sum();

最后两步的另一种写法似乎对初学者更有可读性

listC.stream()
            .flatMap(c1 -> c1.map.values().stream())
            .flatMap(b1 -> b1.map.values().stream())
            .collect(Collectors.summingInt(a -> a.value))
gblwokeq

gblwokeq4#

以下是我的回答:

Integer result = C_list.stream()
   .flatMap(s -> s.getC_map().values().stream()) 
   .flatMap(s -> s.getB_map().values().stream())
   .map(A -> A.getValue())
   .reduce(0, Integer::sum);

相关问题