Java 8 FlatMap - 以嵌套形式添加项目并使用FlatMap

时间:2016-12-01 09:42:52

标签: java java-8 java-stream collectors flatmap

我有一个对象Foo,其中包含Bar列表。这些类描述如下:

class Foo {
    String name;
    List<Bar> bars = new ArrayList<Bar>();

    Foo(String name){
        this.name = name;
    }
}

class Bar {
    String name;

    Bar(String name){
        this.name = name;
    }
}

现在,我正在创建一个Foo个对象列表,每个对象都包含一个Bar对象列表,如下所示:

IntStream
        .range(1, 4)
        .forEach(i -> foos.add(new Foo("Foo" + i)));

foos.forEach(f ->
            IntStream.range(1,4)
                    .forEach(i -> f.bars.add(new Bar("Bar"+i+" -> "+f.name))));

然后在flatMap上使用Stream,如下所示:

foos.stream()
        .flatMap(f -> f.bars.stream())
        .forEach(i -> System.out.println("Bar Name : "+i.name));

如何使用Java Stream和lambdas在一次执行中完成所有这些操作?有没有其他方法可以用Java 8风格做这样的事情?

3 个答案:

答案 0 :(得分:4)

如果你要做的就是打印Bar实例的名称,FooBar实例的整个构造和集合已经过时了。您可以直接生成和打印名称:

IntStream.range(1, 4)
         .mapToObj(i -> "Foo" + i)
         .flatMap(name -> IntStream.range(1, 4)
            .mapToObj(i -> "Bar" + i + "->" + name))
         .forEach(System.out::println);

答案 1 :(得分:1)

您可以在Foo而非mapToObj中生成forEach个实例:

IntStream.range(1, 4)
         .mapToObj (i -> {Foo foo = new Foo("Foo" + i);
                          foo.bars =
                              IntStream.range(1,4)
                                       .mapToObj(j -> new Bar("Bar"+j+" -> "+foo.name))
                                       .collect(Collectors.toList());
                          return foo;
                    })
         .flatMap (f -> f.bars.stream())
         .forEach(i -> System.out.println("Bar Name : "+i.name));

但是,这不会将创建的Foo个实例存储在List中。如果您想将它们存储在List中,请将操作拆分为2 Stream个管道(第一个以collect(Collectors.toList())结尾)或使用peek(f->foos.add(f))添加{{1}实例进入Foo foos(这将要求您在运行管道之前实例化List foos

编辑:

修正了一些拼写错误并测试了代码:

List

答案 2 :(得分:0)

我还使用peek和mapToObject ...

从以下管道操作中获得了分辨率
IntStream.range(1, 4)
            .mapToObj(i -> new Foo("Foo"+i))
            .peek(f -> IntStream.range(1, 4)
                    .mapToObj(i -> new Bar("Bar"+i+"->"+f.name))
                    .forEach(f.bars::add))
            .flatMap(f -> f.bars.stream())
            .forEach(b -> System.out.println("Bar : "+b.name));