java - 我正在尝试通过使用 Java 8 流遍历嵌入式列表来返回数据

标签 java lambda java-8 java-stream

我正在努力退回仅包含 item.baz.fooz == 'snafu' 的项目。我已将下面的代码和源代码匿名化。您的帮助将不胜感激。 我的数据来源:

{
  "data": {
    "searches": [
      {
        "apples": [
          {
            "pears": [
              {
                "sets": [
                  {
                    "items": [
                      {
                        "baz": {
                          "fooz": {
                            "unit": "snafu"
                          }
                        }
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
}

我失败的代码:

List<Item> items =
    response.data.searches.stream()
    .flatMap(
        search -> search.apples.forEach(
           apple -> apple.pears.forEach(
               pear -> pear.sets.forEach(
                   set -> set.items.stream()
                      .filter(item -> item.baz.fooz.unit.equals("snafu"))
                      .collect(Collectors.toList())))));

失败的是(除其他外):

Incompatible type. Required List<Foo> but 'flatmap' was inferred to Stream<R>: no instances of type variable R List<Foo>

最佳答案

不要使用forEach,你需要多个flatMap:

List<Item> snoozles =
    response.data
            .searches
            .stream() // Stream<Search>
            .flatMap(search -> search.apples.stream()) // Stream<Apple>
            .flatMap(apple -> apple.pears.stream()) // Stream<Pear>
            .flatMap(pear -> pear.sets.stream()) // Stream<Set>
            .flatMap(set -> set.items.stream() 
                               .filter(item -> item.baz.fooz.unit.equals("snafu"))) // Stream<Item>
            .collect(Collectors.toList()); // List<Item>

或者(如 Holger 所建议的):

List<Item> snoozles =
    response.data
            .searches
            .stream() // Stream<Search>
            .flatMap(search -> search.apples.stream()) // Stream<Apple>
            .flatMap(apple -> apple.pears.stream()) // Stream<Pear>
            .flatMap(pear -> pear.sets.stream()) // Stream<Set>
            .flatMap(set -> set.items.stream()) // Stream<Item>
            .filter(item -> item.baz.fooz.unit.equals("snafu")) // Stream<Item>
            .collect(Collectors.toList()); // List<Item>

关于java - 我正在尝试通过使用 Java 8 流遍历嵌入式列表来返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56439928/

相关文章:

java - 通过使用反射获取带有注释的字段列表

c++ - 为什么我尝试将按钮连接到 lambda 会失败?

c++ - 捕获此的 lambda 的访问权限

QT 显示 "RTTI symbol not found for class"但工作正常

java-8 - 该方法 "setHeader"的圈复杂度为139,大于授权的10

java - 如何将 List<Long> 转换为 Map<Long, Long>

java - 数量较多的问题

相当于 JavaScript 的 String.match() 的 Java

java - JFrame运行后不显示

java - Spring @PropertySource 值不覆盖