我想保存方法的返回值,并使用它来创建一个新的对象,并将其添加到列表中。以下是更清晰的代码块:
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流方法做到的?
答案 0 :(得分:6)
fooboos = foos
.stream()
.map(foo -> generateBoo(foo).map(boo -> new FooBoo(foo, boo))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
答案 1 :(得分:4)
另一个可能的答案是:
stream
我认为在Java 9中,我们会看到Optional
方法添加到fooboos = foos.stream()
.flatMap(foo -> generateBoo(foo).map(boo -> new FooBoo(foo, boo)).stream())
.collect(Collectors.toList());
。然后我们就可以做到:
<boost::iostreams::seekable
答案 2 :(得分:1)
您需要保留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());