【问题标题】:Using JDK8 Stream how to iterate the nested objects使用JDK8 Stream如何迭代嵌套对象
【发布时间】:2019-06-09 04:33:58
【问题描述】:

我在我的项目中使用 JDK8 流。

我将从第三方应用程序获得下面提到的soap xml 响应。根据要求,我必须捕获包含 ExecutionCode 和相应值的 MetaDataItem。

<Response>
    <ProcessingResults>
      <Identifier>identifier-A</Identifier>
      <StepResult>
        <Identifier>device</Identifier>
        <DataItem>
          <Identifier>key</Identifier>
          <MetaData>
            <MetaDataItem>
              <Name>ExecutionCode</Name>
              <Value>0</Value>
            </MetaDataItem>
          </MetaData>
        </DataItem>
      </StepResult>
    </ProcessingResults>
  </Response>

我不确定如何使用 JDK8 Streams 遍历对象直到 MetaDataItem。我试过了,但没有运气

在我的 JAXB 类中

 1. Response class contains "List<ProcessingResults>". 
 2. Each ProcessingResult class contains the "List<StepResults>".
 3. StepResult class contains the "List<DataIteam>".
 4. DataItem class contains the "List<MetaDataItem>".

【问题讨论】:

  • 多次使用Stream::flatMap?
  • 到目前为止做了什么?
  • @MehrajMalik 我试图单独迭代每个对象,这不是好的做法

标签: java collections java-8 mapping java-stream


【解决方案1】:

您所要做的就是应用flatMap 运算符的序列来获得您需要的东西。这是它的外观,

List<MetaDataItem> metaDataItms = response.getProcessingResult().stream()
        .flatMap(pr -> pr.getStepResults().stream())
        .flatMap(sr -> sr.getDataItms().stream())
        .flatMap(ditm -> ditm.getMetaDataItems().stream())
        .collect(Collectors.toList());

【讨论】:

  • 或者可能是一个嵌套的flatMap,但我怀疑这种情况下的可读性。
【解决方案2】:

看起来你需要Stream.flatMap。试试这个:

List<MetaDataItem> list= 
    response.getProcessingResult().stream()
            .map(ProcessingResult::getStepResults).flatMap(Collection::stream) 
            .map(StepResult::getDataItms).flatMap(Collection::stream) 
            .map(DataItem::getMetaDataItems).flatMap(Collection::stream) 
            .collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 2022-12-20
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2021-10-23
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多