Java 8中的lambda表达式列表内嵌列表过滤。

8

示例JSON

[
  {
    "id": "1",
    "products": [
      {
        "id": "333",
        "status": "Active"
      },
      {
        "id": "222",
        "status": "Inactive"
      },
      {
        "id": "111",
        "status": "Active"
      }

    ]
  },
  {
    "id": "2",
    "products": [
      {
        "id": "6",
        "status": "Active"
      },
      {
        "id": "7",
        "status": "Inactive"
      }
    ]
  }
]

我希望能够检索到至少有一个活动产品的对象列表。

下面的代码返回产品列表,但我想要一个ProdcutResponse列表。有什么方法可以做到这一点吗?

 response.stream()
 .map(ProductResponse::getProducts)
 .filter(s -> "Active".equals(s.getType()))
 .collect(Collectors.toList()) 
1个回答

8

因为您没有展示太多代码,所以以下建议可能有所冒险。我的主要建议是在收集成列表之前不要将Stream<ProductResponse>映射到Stream<List<Product>>

response.stream()
        .filter(pr -> pr.getProducts().stream().anyMatch(s -> "Active".equals(s.getType())))
        .collect(Collectors.toList());

如果您想要List<ProductResponse>仅包含具有活动类型(无论这意味着什么)的Product,则可以将anyMatch更改为allMatch


1
@Forhad 时间复杂度为O(n^2)。需要进行一些预计算以进行优化。 - Jacob G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接