Java 8 Stream从返回值

时间:2016-04-07 19:28:53

标签: java java-8 java-stream

我想保存方法的返回值,并使用它来创建一个新的对象,并将其添加到列表中。以下是更清晰的代码块:

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流方法做到的?

3 个答案:

答案 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的结果时会丢失它。如果您有某种PairTuple,以便可以将FooBoo映射到一个对象,则可以稍后将它们组合在一起。我见过有些人使用两个对象的数组,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());