Java 从嵌套流中收集一组对象

Java 从嵌套流中收集一组对象,java,java-8,java-stream,guava,Java,Java 8,Java Stream,Guava,我有一个场景,其中有两个for循环,一个嵌套在另一个内。在内部循环中,对于每个迭代,我都有创建特定类型的新实例所需的信息。我想将代码从for循环更改为使用流,这样我就可以将所有对象收集到一个ImmutableSet中。然而,我无法制作一个编译并运行的版本。下面的示例程序说明了我最近的尝试。它可以编译,但其中一个参数是硬编码的 如何修复下面的流,以便在分配Bar时,变量s和n都可用 class Bar { private final String s; private final Inte

我有一个场景,其中有两个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());
  }
}
类栏{
私有最终字符串s;
私有最终整数n;
条(字符串s,整数n){
这个.s=s;
这个,n=n;
}
}
公开课Foo{
私有静态列表getList(字符串s){
return list.newArrayList(s.hashCode());
}
Foo(){
ImmutableSet set=ImmutableSet.of(“foo”、“bar”、“baz”)
.stream()
.flatMap->getList.stream()
.map(n->newbar(“,n))//我需要在这里使用s,而不是硬代码
.collect(ImmutableSet.toImmutableSet());
}
}

您似乎在寻找以下内容:

.flatMap(s -> getList(s).stream().map(n -> new Bar(s, n)))
简单地说,将另一个
map
操作链接到
getList(s).stream()
以转换数据,从而使字符串和整数都在范围内


注意,您不仅限于
getList.stream()
。这意味着,只要传递给
flatMap
的函数返回它将编译的
流,就可以将任意多个复杂操作链接在一起。

我希望您必须为此使用POJO包装类,这比使用常规循环要麻烦得多。你需要将平面图和平面图组合成一个平面图。我想这仅仅意味着移动一个)啊,我可以把它们结合起来。我在发布之前尝试过它,但因为它没有编译而犯了一些错误。现在它工作了!