上期我們簡單的介紹了下java Stream這期就具體的操作下。
一、創建Stream
List<string> list = new ArrayList<>();
//一下分別是順序流和並行流,兩種創建方式
Stream<string> stream = list.stream();
Stream<string> parallelStream = list.parallelStream();
System.out.println("stream="+stream);
//java.util.stream.ReferencePipeline$Head@63961c42
System.out.println("parallelStream="+parallelStream);
//java.util.stream.ReferencePipeline$Head@65b54208
//2.使用Arrays的stream方法
Integer[] age = new Integer[5];
Stream<integer> stream1 = Arrays.stream(age);
System.out.println("stream1="+stream);
//stream1=java.util.stream.ReferencePipeline$Head@63961c42
//3使用Stream中的靜態方法:of()、iterate()、generate()
Stream<integer> ofStream = Stream.of(0, 1, 2, 3);
Stream<integer> limit = Stream.iterate(1, (n) -> n * 2).limit(10);
Stream<double> genStr = Stream.generate(Math::random).limit(10);
genStr.forEach(System.out::println);
//0.9971723393777241 0.08860941392629373
limit.forEach(System.out::println);//1 2 4 8 16 32 64
System.out.println("ofStream="+ofStream);
//java.util.stream.ReferencePipeline$Head@685f4c2e
//使用 BufferedReader.lines() 方法,將每行內容轉成流
BufferedReader reader = new BufferedReader(new FileReader("C:\\\\記錄表20190715 (1).xlsx"));
Stream<string> lines = reader.lines();
lines.forEach(System.out::println);//PK! �)�]s[Content_Types].xml �(�
2. 流的中間操作
/**
* filter:過濾流中的某些元素
* limit(n):獲取n個元素
* skip(n):跳過n元素,配合limit(n)可實現分頁
*distinct:通過流中元素的 hashCode() 和 equals() 去除重複元素
*/
Stream<integer> integerStream = Stream.of(2, 3, 3, 3, 4, 455, 5, 5, 6, 56, 66, 4, 44);
Stream<integer> fit = integerStream.filter(s -> s < 66)//2, 3, 3, 3, 4 .......
.distinct()//2 4
.skip(2).limit(2);
fit.forEach(System.out::println);// 4 5
/<integer>/<integer>/<string>/<double>/<integer>/<integer>/<integer>/<string>/<string>/<string>
2.2 映射
map:接收一個函數作為參數,該函數會被應用到每個元素上,並將其映射成一個新的元素。
flatMap:接收一個函數作為參數,將流中的每個值都換成另一個流,然後把所有流連接成一個流。
Stream<string> flaMap = list.stream().flatMap(s -> {
String[] split = s.split(",");
Stream<string> stream = Arrays.stream(split);
return stream;
});
flaMap.forEach(System.out::println);
/**
* aaa,bbb,ccc 2222 33 444 aaa bbb ccc
*/
/<string>/<string>
2.3 排序
sorted():自然排序,流中元素需實現Comparable接口
sorted(Comparator com):定製排序,自定義Comparator排序器
List<string> list = Arrays.asList("aa", "bb", "cc", "dd");
list.stream().forEach(System.out::println);
/<string>
2.4 消費
peek:如同於map,能得到流中的每一個元素。但map接收的是一個Function表達式,有返回值;而peek接收的是Consumer表達式,沒有返回值。
Student s1 = new Student("aa", "10");
Student s2 = new Student("bb", "22");
List<student> list = Arrays.asList(s2, s2);
list.stream().peek(student -> student.setAge("222"))
.forEach(System.out::println);
/<student>
閱讀更多 LOVER 的文章