Как мне добиться этого с помощью flatMap - PullRequest
1 голос
/ 27 сентября 2019

Мне нужно создать новый внутренний список и использовать его для настройки внешнего списка.Как я могу сделать с помощью flatMap.fooList - это список объекта FooDb, из которого я создаю список объекта Foo.

final ArrayList<FooDb> fooList= getFooFromDB();    
final ArrayList<Foo> foos = new ArrayList<>();
            fooList.forEach(foo -> {
                final ArrayList<Bar> bars = new ArrayList<>();
                item.getItems()
                    .forEach(item -> bars.add(new Bar(foo.getId(), foo.getName())));
                foos.add(new Foo(0L, foo.getId(), bars));
            });

Ответы [ 2 ]

4 голосов
/ 27 сентября 2019

Вам не нужно flatMap.У вас есть две операции map:

  1. List<Item> -> List<Foo(..., ..., List<Bar>)> и
  2. List<Item> -> List<Bar>, необходимые для первого.

List<Foo> foos = 
    itemsList.stream()
             .map(item -> new Foo(0L, item.getId(), item.getItems()
                                                        .stream()
                                                        .map(i -> new Bar(i.getId(), i.getName()))
                                                        .collect(Collectors.toList())))
             .collect(Collectors.toList());

Ужасное форматирование, я работаю с Stream API уже несколько лет и никогда не мог написать красивую цепочку.Не стесняйтесь редактировать.

0 голосов
/ 27 сентября 2019

Вам не нужен FlatMap, чтобы сделать это.FlatMap, как правило, должен использоваться для выравнивания содержимого массива.В этом случае вам нужно отображение 1 к 1, поэтому правильный путь - это функция карты.

itemsList
.stream()
.map(item -> new Foo(0L,item.getId, item
                                    .getItems()
                                    .stream()
                                    .map(item -> new Bar(item.getId(),item.getName())).collect(toList())));
...