[英]Java 8 Stream add new object to list from return value
我想保存方法的返回值,并使用它来创建一个新的对象,添加到列表中。 以下是更清晰的代码块:
final List<FooBoo> fooboos = new ArrayList<>();
for (Foo foo : foos) {
Optional<Boo> boo = generateBoo(foo);
if (boo.isPresent()) {
fooboos.add(new FooBoo(foo, boo.get()));
}
}
我尝试过这样的事情:
fooboos = foos
.stream()
.map(f -> generateBoo(f))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
但显然我在这里遗漏了一些实际上正在创建FooBoo
对象的东西。 我如何使用java流方法完成这项工作?
fooboos = foos
.stream()
.map(foo -> generateBoo(foo).map(boo -> new FooBoo(foo, boo))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
另一个可能的答案是:
fooboos = foos.stream()
.flatMap(foo -> generateBoo(foo)
.map(boo -> new FooBoo(foo, boo))
.map(Stream::of)
.orElseGet(Stream::empty)
).collect(Collectors.toList());
我认为在Java 9中我们将看到一个添加到Optional
的stream
方法。 然后我们就能做到:
fooboos = foos.stream()
.flatMap(foo -> generateBoo(foo).map(boo -> new FooBoo(foo, boo)).stream())
.collect(Collectors.toList());
你需要保持Foo
,但是当你将它映射到generateBoo
的结果时你会失去它。 如果你有某种Pair
或Tuple
那么你可以将Foo
和Boo
映射到一个对象,然后你可以将它们组合起来。 我见过有些人使用两个对象的数组和AbstractMap.SimpleImmutableEntry
作为快速和脏Pair
等价物,两者都很尴尬。 无论您是使用现有的东西还是创建自己的简单Pair
对象,在这种情况下都不会质疑使用Optional
的智慧,您可以这样做:
fooboos = foos
.stream()
.map(f -> new Pair(f, generateBoo(f))
.filter(p -> p.getV2().isPresent())
.map(p -> new Pair(p.getV1(), p.getV2().get())
.map(p -> new Fooboo(p.getV1(), p.getV2()))
.collect(Collectors.toList());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.