当前位置: 首页 > 知识库问答 >
问题:

如何用嵌套映射函数修复“流已被操作或关闭”错误

陈俊誉
2023-03-14

当我试图在两个流上执行函数并产生一个出来时,我遇到了“流已经被操作或关闭”。

我已经尝试过使用StreamSupplier了,但是它似乎并不能解决这个问题,如果我将两个流都转换为字符串列表并执行嵌套循环,它就会得到解决。但我想看看这将是什么流解决方案。

String[] str1 = new String[]{"A","B","C"};
String[] str2 = new String[]{"a","b","c"};
private Stream<String> method(final Stream<String> str1,
            final Stream<String> str2) {
       return str1
               .flatMap(s1 -> str2
                       .map(s2 -> simpleStringConcatFunction_1(s1) + simpleStringConcatFunction_2(s2));

我用双循环来实现这些代码是

private Stream<String> generateFilePatterns(final Stream<String> str1,
            final Stream<String> str2) {
        List<String> list1 = str1.collect(Collectors.toList());
        List<String> list2 = str2.collect(Collectors.toList());
        List<String> list = new ArrayList<>();
        for( String s1 : list1){
            for(String s2 : list2){
                list.add(simpleStringConcatFunction_1(s1) + simpleStringConcatFunction_2(s2);
            }
        }
        return list.stream();
    }

共有1个答案

越飞语
2023-03-14

执行在非流代码中所做的一半,即获取str2的快照,以便可以将其多次流化:

List<String> list2 = str2.collect(Collectors.toList());
return str1.flatMap(s1 -> list2.stream()
                               .map(s2 -> simpleStringConcatFunction_1(s1) +
                                          simpleStringConcatFunction_2(s2)));
 类似资料:
  • 方法是 现在我试着像这样改成stream,但我不知道这种改是否正确: 如何避免出现例外,解决问题? 我应该以某种方式重构代码吗?

  • 下面是我的代码: 从下面的函数调用上面的函数: 我不知道为什么。

  • 我想复制一个Java8流,这样我可以处理它两次。我可以

  • 我想复制一个Java 8流,这样我可以处理它两次。我可以作为列表并从中获取新流; 但我觉得应该有一个更高效/更优雅的方法。 有没有一种方法可以复制流而不将其变成集合? 我实际上正在处理一个流,所以在移动到右侧投影并以另一种方式处理之前,希望先以一种方式处理左侧投影。类似于这样(到目前为止,我不得不使用技巧)。

  • 问题内容: 我想复制一个Java 8流,以便可以处理两次。我可以collect列出并从中获得新的信息流; 但我认为应该有一种更有效/更优雅的方法。 有没有一种方法可以复制流而不将其转换为集合? 我实际上正在使用 流,因此想先处理左侧投影,然后再移至右侧投影并以另一种方式处理。有点像这样(到目前为止,我被迫使用这种技巧)。 问题答案: 你可以将局部变量与一起使用,以设置流管道的公共部分。 从http