Java 8 - 字符串流不同 - IllegalStateException

Mat*_*W90 1 java java-8 java-stream

我有不同的上行动问题streamString的。

Stream<String> names = Arrays.asList("NAME A", "NAME B", "NAME A").stream();
names.distinct();
System.out.println(names.collect(Collectors.joining(",")));
Run Code Online (Sandbox Code Playgroud)

然后,我收到异常:

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.Test.main(Test.java:62)
Run Code Online (Sandbox Code Playgroud)

但是如果我这样写这部分代码:

Stream<String> names = Arrays.asList("NAME A", "NAME B", "NAME A").stream();
final Stream<String> distinct = names.distinct();
System.out.println(distinct.collect(Collectors.joining(",")));
Run Code Online (Sandbox Code Playgroud)

一切都好。

独特的文档说:

Stream distinct() 返回由该流的不同元素(根据 Object.equals(Object))组成的流。对于有序流,不同元素的选择是稳定的(对于重复元素,保留遇到顺序中最先出现的元素。)对于无序流,没有稳定性保证。这是一个有状态的中间操作。

我做错了什么?

感谢帮助

hag*_*age 5

文档和错误消息为您提供了原因:stream has already been operated upon or closeddistinct() Returns a stream

当您调用distincton 时names,它会返回一个具有不同元素的新流。但你collectnames一次。但是这个流已经被distinct操作员消费了。

在您的第二个示例中,您正确地使用它,因为您收集了不同的流。

所以基本上,你总是必须像在你的第二个例子中那样做,或者简而言之

names.distinct().collect(Collectors.joining(","));
Run Code Online (Sandbox Code Playgroud)