2017-06-05 152 views
3

我一直在寻找我需要做的事情,但我无法将它们放在一起。首先,这是我的目的,简单地说:将映射列表转换为映射到原始数组

Object1 
    Object2 
     Map<String, Double> 

我需要做的是,开始的Object1列表,获取给定一个特定的键映射的值double[](中的所有对象列表在地图中具有相同的N个键)。

这里是我开始尝试:

myList.stream().map(Object1::getObject2).map(Object2::getMyMap).map(m -> m.get(key).collect(Collectors.toCollection(ArrayList::new)) 

我不知道如何从这里到基本数组。如果目前为止这很好,我该从哪里出发?如果有更好的方法来做这件事,我愿意接受建议。任何帮助表示赞赏,谢谢。

回答

7

使用.mapToDouble做出DoubleStream

myList.stream() 
    .map(Object1::getObject2) 
    .map(Object2::getMyMap) 
    .mapToDouble(m -> m.get(key)) // or throw if key is not in map 
    .toArray(); 
+1

慎用'null'值。 – lexicore

+3

要不抛出,请执行:myList.stream()。map(o - > o.getObject2()。getMyMap()。get(key))。filter(d - > d!= null).mapToDouble(Double :: doubleValue).toArray()' – Andreas

+2

根据OP的描述,抛出可能更合适。如果其中一个映射遗漏了'key',则数据无效,代码应该快速失败,而不是返回更短的数组。 – Misha