本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵。
本节课先简单的介绍下Java8有哪些新特性,对于Java6/7版本做出哪些更改.那废话不多说,赶紧开始今天的课程吧.
对于经常使用Stream
的小伙伴来说,异常是必不可少的,尤其是下面这一条,最为常见!
stream has already been operated upon or closed
下面看个例子吧,怎么就报错了呢
public static void main(String[] args) {
String[] array = {"a", "b", "c", "d", "e"};
Stream<String> stream = Arrays.stream(array);
// stream for
stream.forEach(System.out::println);
// reuse it to filter again! throws IllegalStateException
long count = stream.filter("b"::equals).count();
System.out.println(count);
}
在运行时会出现以下异常
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
at java.util.stream.ReferencePipeline.<init>(ReferencePipeline.java:94)
at java.util.stream.ReferencePipeline$StatelessOp.<init>(ReferencePipeline.java:618)
at java.util.stream.ReferencePipeline$2.<init>(ReferencePipeline.java:163)
at java.util.stream.ReferencePipeline.filter(ReferencePipeline.java:162)
at Java82.main(Java82.java:21)
其实看到这个错误,有的人会想到response
的那个错误,哈哈,其实这个错误就是流已经被操作或关闭
因为它只能消费一次,所以才会报错的
那么下面看下怎么解决吧
public static void main(String[] args) {
String[] array = {"a", "b", "c", "d", "e"};
Stream<String> stream = Arrays.stream(array);
Supplier<Stream<String>> streamSupplier = () -> Stream.of(array);
//重新获取一个新的stream
streamSupplier.get().forEach(System.out::println);
//获取一个别的新的stream
long count = streamSupplier.get().filter("b"::equals).count();
System.out.println(count);
}
其实解决方式就是通过streamSupplier
函数重新获取一个新的流即可.
其实关于Stream的问题还有很多, 以后我会专门写个错误篇章来发布.
已经更新了好几篇文章了,小伙伴们学会了吗?
是不是已经对java8已经有了很深的了解了
网友评论