繁体   English   中英

Java 8 Stream从返回值添加新对象到列表

[英]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中我们将看到一个添加到Optionalstream方法。 然后我们就能做到:

fooboos = foos.stream()
              .flatMap(foo -> generateBoo(foo).map(boo -> new FooBoo(foo, boo)).stream())
              .collect(Collectors.toList());

你需要保持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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM