将带有map的对象列表转换为基元数组

Mik*_*ity 3 java lambda java-8 java-stream

我一直在找一些我需要做的事情,但是我很难把它们放在一起.首先,这是我的目标,简单地说:

Object1
    Object2
        Map<String, Double>
Run Code Online (Sandbox Code Playgroud)

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

这是我的开始尝试:

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

我不知道如何从这里获得原始数组.如果到目前为止这是好的,我从哪里开始?如果有更好的方法来做这件事,我愿意接受建议.感谢任何帮助,谢谢.

Mis*_*sha 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();
Run Code Online (Sandbox Code Playgroud)

  • 要不抛出,请执行以下操作:`myList.stream().map(o - > o.getObject2().getMyMap().get(key)).filter(d - > d!= null).mapToDouble(Double: :的doubleValue).toArray()` (3认同)
  • 根据OP的描述,投掷可能更合适.如果其中一个映射缺少`key`,则数据无效,代码应该快速失败而不是返回较短的数组. (2认同)
  • 或者也许是`mapToDouble(m - > m.getOrDefault(key,0.0))`.谁知道?我们在这里猜测.当没有给定密钥的条目时,让我们让OP决定什么更好. (2认同)