从嵌套流中收集一组对象

时间:2018-03-29 12:46:14

标签: java java-8 java-stream guava

我有一个场景,我有两个for循环,一个嵌套在另一个循环中。在内部循环中,对于每次迭代,我都有创建特定类型的新实例所需的信息。我想将代码从for循环更改为使用流,因此我可以将所有对象收集到ImmutableSet中。但是,我无法制作一个编译和工作的版本。下面的示例程序说明了我最接近的尝试。它编译,但其中一个参数是硬编码的。

如何修复下面的流,以便在分配Bar时,我有变量s和n可用?

class Bar {
  private final String s;
  private final Integer n;

  Bar(String s, Integer n) {
    this.s = s;
    this.n = n;
  }
}

public class Foo {

  private static List<Integer> getList(String s) {
    return Lists.newArrayList(s.hashCode());
  }

  Foo() {
    ImmutableSet<Bar> set = ImmutableSet.of("foo", "bar", "baz")
            .stream()
            .flatMap(s -> getList(s).stream())
            .map(n -> new Bar("", n)) // I need to use s here, not hard-code
            .collect(ImmutableSet.toImmutableSet());
  }
}

1 个答案:

答案 0 :(得分:6)

好像你正在寻找以下内容:

.flatMap(s -> getList(s).stream().map(n -> new Bar(s, n)))

简单地说,将另一个map操作链接到getList(s).stream()以转换数据,从而使您可以同时拥有字符串和整数。

注意,您不仅限于getList(s).stream()。意思是只要传递给flatMap的函数返回它将编译的Stream<R>,就可以将任意数量的复杂操作链接在一起。