我如何使用 flatMap 实现此目的

How do I achieve this using a flatMap

我需要创建一个新的内部列表并使用它来设置外部列表。我该怎么做才能使用 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));
            });

您不需要 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 几年了,从来没有写出好看的链。欢迎编辑。

你不需要 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())));