簡體   English   中英

Java 8 FlatMap-以嵌套形式添加項目並使用FlatMap檢索對象

[英]Java 8 FlatMap - Add items in a nested form and retrieve object using 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))));

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

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

如何使用Java Stream和lambda在一次執行中完成所有這些操作? 還有其他方法可以使用Java 8樣式執行此類操作嗎?

如果您要做的只是打印Bar實例的名稱,那么FooBar實例的整個構造和集合Foo過時。 您可以直接生成並打印名稱:

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

您可以在mapToObj而不是forEach生成Foo實例:

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))添加Foo實例進入foos List (這需要您在運行管道之前實例化foos List )。

編輯:

修復了一些拼寫錯誤並測試了代碼:

Bar Name : Bar1 -> Foo1
Bar Name : Bar2 -> Foo1
Bar Name : Bar3 -> Foo1
Bar Name : Bar1 -> Foo2
Bar Name : Bar2 -> Foo2
Bar Name : Bar3 -> Foo2
Bar Name : Bar1 -> Foo3
Bar Name : Bar2 -> Foo3
Bar Name : Bar3 -> Foo3

我還通過使用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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM