[英]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
實例的名稱,那么Foo
和Bar
實例的整個構造和集合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.