一、什么是Stream流
Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數(shù)據(jù)。
Stream 使用一種類似用 SQL 語句從數(shù)據(jù)庫查詢數(shù)據(jù)的直觀方式來提供一種對 Java 集合運算和表達(dá)的高階抽象。
Stream API可以極大提高Java程序員的生產(chǎn)力,讓程序員寫出高效率、干凈、簡潔的代碼。
這種風(fēng)格將要處理的元素集合看作一種流, 流在管道中傳輸, 并且可以在管道的節(jié)點上進(jìn)行處理, 比如篩選, 排序,聚合等。
元素流在管道中經(jīng)過中間操作(intermediate operation)的處理,最后由最終操作(terminal operation)得到前面處理的結(jié)果。
public class Demo02Stream {
public static void main(String[] args) {
//創(chuàng)建一個List集合,存儲姓名
List<String> list = new ArrayList<>();
list.add("張無忌");
list.add("周芷若");
list.add("趙敏");
list.add("張強");
list.add("張三豐");
//對list集合中的元素進(jìn)行過濾,只要以張開頭的元素,存儲到一個新的集合中
//對listA集合進(jìn)行過濾,只要姓名長度為3的人,存儲到一個新集合中
//遍歷listB集合
list.stream()
.filter(name->name.startsWith("張"))
.filter(name->name.length()==3)
.forEach(System.out::println);
}
}
Stream(流)是一個來自數(shù)據(jù)源的元素隊列并支持聚合操作
- 元素是特定類型的對象,形成一個隊列。 Java中的Stream并不會存儲元素,而是按需計算。
- 數(shù)據(jù)源 流的來源。 可以是集合,數(shù)組,I/O channel, 產(chǎn)生器generator 等。
- 聚合操作 類似SQL語句一樣的操作, 比如filter, map, reduce, find, match, sorted等。
和以前的Collection操作不同, Stream操作還有兩個基礎(chǔ)的特征:
- Pipelining: 中間操作都會返回流對象本身。 這樣多個操作可以串聯(lián)成一個管道, 如同流式風(fēng)格(fluent style)。 這樣做可以對操作進(jìn)行優(yōu)化, 比如延遲執(zhí)行(laziness)和短路( short-circuiting)。
- 內(nèi)部迭代: 以前對集合遍歷都是通過Iterator或者For-Each的方式, 顯式的在集合外部進(jìn)行迭代, 這叫做外部迭代。 Stream提供了內(nèi)部迭代的方式, 通過訪問者模式(Visitor)實現(xiàn)。
二、Stream流操作
1)stream 生成流
//把集合轉(zhuǎn)換為Stream流
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
Set<String> set = new HashSet<>();
Stream<String> stream2 = set.stream();
Map<String,String> map = new HashMap<>();
//獲取鍵,存儲到一個Set集合中
Set<String> keySet = map.keySet();
Stream<String> stream3 = keySet.stream();
//獲取值,存儲到一個Collection集合中
Collection<String> values = map.values();
Stream<String> stream4 = values.stream();
//獲取鍵值對(鍵與值的映射關(guān)系 entrySet)
Set<Map.Entry<String, String>> entries = map.entrySet();
Stream<Map.Entry<String, String>> stream5 = entries.stream();
//把數(shù)組轉(zhuǎn)換為Stream流
Stream<Integer> stream6 = Stream.of(1, 2, 3, 4, 5);
//可變參數(shù)可以傳遞數(shù)組
Integer[] arr = {1,2,3,4,5};
Stream<Integer> stream7 = Stream.of(arr);
2)forEach 遍歷
// 獲取一個Stream流
Stream<String> stream = Stream.of("張三", "李四", "王五", "趙六", "田七");
// 使用Stream流中的方法forEach對Stream流中的數(shù)據(jù)進(jìn)行遍歷
stream.forEach((String name)->{
System.out.println(name);
});
// 簡化
stream.forEach(System.out::println);
3)filter 過濾
//創(chuàng)建一個List集合,存儲姓名
List<String> list = new ArrayList<>();
list.add("張無忌");
list.add("周芷若");
list.add("趙敏");
list.add("張強");
list.add("張三豐");
//對list集合中的元素進(jìn)行過濾,只要以張開頭的元素,存儲到一個新的集合中
//對listA集合進(jìn)行過濾,只要姓名長度為3的人,存儲到一個新集合中
//遍歷listB集合
list.stream()
.filter(name->name.startsWith("張"))
.filter(name->name.length()==3)
.forEach(System.out::println);
4)map 映射
//獲取一個String類型的Stream流
Stream<String> stream = Stream.of("1", "2", "3", "4");
//使用map方法,把字符串類型的整數(shù),轉(zhuǎn)換(映射)為Integer類型的整數(shù)
Stream<Integer> stream2 = stream.map((String s)->Integer.parseInt(s));
5)count 統(tǒng)計流中的元素個數(shù)
//獲取一個Stream流
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Stream<Integer> stream = list.stream();
long count = stream.count();
System.out.println(count);//3
6)limit 截取流中的元素
//獲取一個Stream流
String[] arr = {"美羊羊","喜洋洋","懶洋洋","灰太狼","紅太狼"};
Stream<String> stream = Stream.of(arr);
//使用limit對Stream流中的元素進(jìn)行截取,只要前3個元素
Stream<String> stream2 = stream.limit(3);
//遍歷stream2流
stream2.forEach(System.out::println);
/*美羊羊
喜洋洋
懶洋洋*/
7)skip 用于跳過元素
//獲取一個Stream流
String[] arr = {"美羊羊","喜洋洋","懶洋洋","灰太狼","紅太狼"};
Stream<String> stream = Stream.of(arr);
//使用skip方法跳過前3個元素
Stream<String> stream2 = stream.skip(3);
//遍歷stream2流
stream2.forEach(System.out::println);
/*灰太狼
紅太狼*/
8)concat 把流組合到一起
//創(chuàng)建一個Stream流
Stream<String> stream1 = Stream.of("張三豐", "張翠山", "趙敏", "周芷若", "張無忌");
//獲取一個Stream流
String[] arr = {"美羊羊","喜洋洋","懶洋洋","灰太狼","紅太狼"};
Stream<String> stream2 = Stream.of(arr);
//把以上兩個流組合為一個流
Stream<String> concat = Stream.concat(stream1, stream2);
//遍歷concat流
concat.forEach(System.out::println);
/*張三豐
張翠山
趙敏
周芷若
張無忌
美羊羊
喜洋洋
懶洋洋
灰太狼
紅太狼*/
9)sorted 排序
以下代碼片段使用 sorted 方法對輸出的 10 個隨機數(shù)進(jìn)行排序:
Random random = new Random();
random.ints()
.limit(10)
.sorted()
.forEach(System.out::println);
|