【问题标题】:Use stream() to convert nested list into list使用 stream() 将嵌套列表转换为列表
【发布时间】:2021-08-13 18:18:20
【问题描述】:

我有一个数组列表“响应”,每个元素都包含一个对象 Meta 和 List(Values),即一个包含嵌套列表和每个嵌套列表的一些元数据的列表。我想在此使用 stream() 来创建一个新列表。新列表将包含所有值对象及其对应的元数据。我怎样才能使用 response.stream() 来完成这个?

    //Input
    Meta meta1 = new Meta("name1");
    Meta meta2 = new Meta("name2");
    Meta meta3 = new Meta("name3");
    List<Values> values1 = new ArrayList<>();
    values1.add(new Values("1 Aug", 1.0F));
    values1.add(new Values("2 Aug", 2.0F));
    values1.add(new Values("3 Aug", 3.0F));
    List<Values> values2 = new ArrayList<>();
    values2.add(new Values("1 Aug", 4.0F));
    values2.add(new Values("2 Aug", 5.0F));
    values2.add(new Values("3 Aug", 6.0F));
    List<Values> values3 = new ArrayList<>();
    values3.add(new Values("1 Aug", 7.0F));
    values3.add(new Values("2 Aug", 8.0F));
    values3.add(new Values("3 Aug", 9.0F));
    Response response1 = new Response(meta1, values1);
    Response response2 = new Response(meta2, values2);
    Response response3 = new Response(meta3, values3);
    List<Response> response = new ArrayList<>();
    response.add(response1);
    response.add(response2);
    response.add(response3);

    //use response.stream()...

    //output
    List<MetaValue> metaValueList = new ArrayList<>();
    metaValueList.add(new MetaValue("name1", "1 Aug", 1.0F));
    metaValueList.add(new MetaValue("name1", "2 Aug", 2.0F));
    metaValueList.add(new MetaValue("name1", "3 Aug", 3.0F));
    metaValueList.add(new MetaValue("name2", "1 Aug", 4.0F));
    metaValueList.add(new MetaValue("name2", "2 Aug", 5.0F));
    metaValueList.add(new MetaValue("name2", "3 Aug", 6.0F));
    metaValueList.add(new MetaValue("name3", "1 Aug", 7.0F));
    metaValueList.add(new MetaValue("name3", "2 Aug", 8.0F));
    metaValueList.add(new MetaValue("name3", "3 Aug", 9.0F));

【问题讨论】:

  • 您确定要List吗?听起来更像是您想要类似于 Map 的东西。
  • 您将需要嵌套的forEach 循环并构建您需要的最终数据。

标签: java java-stream


【解决方案1】:

您需要流式传输响应并对值进行平面映射。由于您没有提供类定义,因此我会随意命名,但这应该会给您一个想法:

List<MetaValue> metaValueList = response.stream()
        .flatMap(r -> r.getValues()
                .stream()
                .map(v -> new MetaValue(r.getMeta().getName(), v.getDate(), v.getValue())))
        .collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2010-12-23
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多