Я пытаюсь вернуть данные путем обхода встроенных списков с использованием потоков Java 8 - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь вернуть предметы, содержащие 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>

1 Ответ

4 голосов
/ 04 июня 2019

Не используйте 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>

Или (как предложил Хольгер):

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...