出現java.lang.IllegalStateException: stream has already been operated upon or closed。java
原文連接 :數組
package com.jdk8.newFeatures; import org.junit.Test; import javax.swing.*; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.stream.Collectors; import java.util.stream.Stream; /** * 測試Stream 的集合流 */ public class StreamTest01 { @Test public void test(){ // 1-1準備初始的數據流,經過已有的集合來建立流 無存儲。 //Stream不是一種數據結構,它只是某種數據源的一個視圖,數據源能夠是一個數組,Java容器或I/O channel等 List<String> strings = new ArrayList<>(Arrays.asList("111","222","333")); // 1-2建立Stream Stream stream = strings.stream(); stream.forEach(System.out::println); // stream.forEach(System.out::println); // 不加註釋,會對stream操做兩次,出現java.lang.IllegalStateException: stream has already been operated upon or closed // 1-3 或者經過已有的數據來建立Stream建立流,可使用Stream類提供的Stream.of()方法,直接返回一個由指定元素組成的流。 Stream<String> streamxx = Stream.of("aaa","bbb","ccc"); streamxx.forEach( i->System.out.println("(2)"+i) ); //2-1 filter 過濾條件 中間操做 List<String> lists = Arrays.asList("AAA","","BBB","CCC"); lists.stream().filter(s -> s.length()>0).forEach(i -> System.out.println("filter後:"+i)); // 2-2 map映射 中間操做 List<Integer> numbers = Arrays.asList(11,2,3,14,14); numbers.stream().map(i->i*i).forEach(i -> System.out.println("平方數後:"+i)); // 2-3 limit/skip limit ,返回 Stream 的前面 n 個元素;skip 則是扔掉前 n 個元素 System.out.println("執行limit後:"); numbers.stream().limit(4).forEach(System.out::println); // 2-4 sorted 方法用於對流進行排序 System.out.println("排序後:"); numbers.stream().sorted().forEach(System.out::println); // 2-5 distinct主要用來去重,如下代碼片斷使用 distinct 對元素進行去重 System.out.println("distinct 對元素進行去重: "); numbers.stream().distinct().forEach(System.out::println); // 3 Stream的最終操做 : 計算出流中元素的個數、將流裝換成集合等。 //3-1 最終結果討論 count用來統計流中的個數 System.out.println("count用來統計流中的元素個數: "); System.out.println(numbers.stream().count()); //3-2 forEach 遍歷單個子元素進行操做,ints()返回的是一個intStream() new Random().ints().limit(4).forEach(System.out::println); //3-3 collect 就是一個規約操做,能夠接受各類作法做爲參數,將流中的元素累計匯成集合框架中的一種,如List List<String> string3 = Arrays.asList("Hollis", "HollisChuang", "hollis","Hollis666", "Hello", "HelloWorld", "Hollis"); string3 = string3.stream().filter(string -> string.startsWith("Hollis")).collect(Collectors.toList()); System.out.println("string3的collect後的測試是:"+string3); } }
111 222 333 (2)aaa (2)bbb (2)ccc filter後:AAA filter後:BBB filter後:CCC 平方數後:121 平方數後:4 平方數後:9 平方數後:196 平方數後:196 執行limit後: 11 2 3 14 排序後: 2 3 11 14 14 distinct 對元素進行去重: 11 2 3 14 count用來統計流中的元素個數: 5 1651256773 1647013782 -1530012352 1888788786 string3的collect後的測試是:[Hollis, HollisChuang, Hollis666, Hollis]