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

流已被供应商操作或关闭

靳睿
2023-03-14
private Stream<User> getUserStream(Stream<User> testStream) { 
    Supplier<Stream<User>> supplierUserStream=()->userStream;
    supplierUserStream.get().sorted();
    supplierUserStream.get().sorted();// throw exception Stream has already been operated upon or closed
    return userStream;
}
Supplier<Stream<User>> streamSupplier
        = () -> Stream.of(userStream.toArray(size -> new User[size]));

共有1个答案

涂选
2023-03-14

仔细看这条信息(重点是我的):

IllegalStateException:流已经被操作或关闭

因为在第一条语句中没有终端操作,所以流并没有被关闭,而是被操作了,这就是为什么在第二次尝试对它进行操作时会出现错误的原因。

supplierUserStream.get().sorted().sorted();

但是,这将是一种潜在问题的隐藏。例如,如果将main中的测试调用替换为以下语句,您将再次得到相同的问题:

getStringStream(Stream.of("Hello", "World")).forEach(System.out::println);

处理它的一个好方法可以是Ernest_k所建议的:

它也可以通过跟踪派生流对象来解决。Stream Stream=s.get().sorted();stream=stream.sorted();返回stream.sorted();以重用那些冗余的sort()调用。

import java.util.function.Supplier;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        getStringStream(Stream.of("World", "Hello", "Good morning!")).forEach(System.out::println);
    }

    private static Stream<String> getStringStream(Stream<String> testStream) {
        Supplier<Stream<String>> supplierStringStream = () -> testStream;
        Stream<String> stream = supplierStringStream.get().sorted();
        return stream.sorted();
    }
}
Good morning!
Hello
World
 类似资料:
  • 即使我在我的流中使用Supplier并在每次我想检索我的strem并对其执行终端操作时使用Supplier.get(),我仍然得到“Stream已经被操作或关闭”异常。有人能看看我的代码并建议我做错了什么吗? 引发异常的方法: 流供应商:

  • 方法是 现在我试着像这样改成stream,但我不知道这种改是否正确: 如何避免出现例外,解决问题? 我应该以某种方式重构代码吗?

  • java-stream已被操作或关闭 与合作可以解决此问题。 所以我当前的代码如下: 相同的错误信息。

  • 问题内容: 我正在尝试使用Stream API生成Order实例。我有一个创建订单的工厂函数,并且使用DoubleStream初始化订单金额。 如果我使用文字(1.0)初始化Order实例,则可以正常工作。当我使用doubleStream创建随机数量时,将引发异常。 问题答案: 答案在(重点是我的)的javadoc中: 流仅应操作一次(调用中间流或终端流操作) 。例如,这排除了“分叉”流,其中相同

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

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