Mat*_*W90 1 java java-8 java-stream
我有不同的上行动问题stream的String的。
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))组成的流。对于有序流,不同元素的选择是稳定的(对于重复元素,保留遇到顺序中最先出现的元素。)对于无序流,没有稳定性保证。这是一个有状态的中间操作。
我做错了什么?
感谢帮助
文档和错误消息为您提供了原因:stream has already been operated upon or closed和distinct() Returns a stream
当您调用distincton 时names,它会返回一个具有不同元素的新流。但你collect上 names一次。但是这个流已经被distinct操作员消费了。
在您的第二个示例中,您正确地使用它,因为您收集了不同的流。
所以基本上,你总是必须像在你的第二个例子中那样做,或者简而言之
names.distinct().collect(Collectors.joining(","));
Run Code Online (Sandbox Code Playgroud)