java - 从嵌套流中收集对象集

标签 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());
  }
}

最佳答案

您似乎在寻找类似以下内容的内容:

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

简单地,链接另一个 map操作getList(s).stream()转换数据,从而使您能够在范围内同时拥有字符串和整数。

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

关于java - 从嵌套流中收集对象集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49556468/

相关文章:

java - 比较器:此语言级别不支持方法引用?

java - 使用 Stream-Java 8 替换文件中的文本

java - 创建一个不断输出输出的循环,直到用户键入一个词来停止该过程

Java 继承向下转型 ClassCastException

java - 打印 JAXB 生成的 bean

java - orElseThrow 比 if(obj == null) 更好吗?

java - Stream.max() 总是比stream.reduce() 快吗?

Java流减少

java - 如何使用 Java Stream API 迭代具有自定义对象的 HashMap

java - 静态方法或 getter 上的 Bean 验证列表<?>