Stream的簡單介紹和List的流操作
阿新 • • 發佈:2020-09-07
1、stream特點
-
stream的操作必須使用lambda作為引數
-
stream沒有內部儲存,只是類似水流一樣從資料來源抓取資料
-
對資料來源進行操作但不能改變資料來源,而是得到一個新的stream,並可以組成集合陣列等
-
消費性,stream只能被消費一次,消費以後就失效了,如果還需要消費,則必須重新生成stream,即同一個stream物件只能使用一次
2、Stream中的部分常用方法
collect()
將流輸出為特定的格式,如陣列、集合等,通常結合其他方法使用,比如filter()和map()等,將這些方法返回的新的流輸出為特定格式
filter()
將流通過指定的方式過濾,得到所有返回為true的元素,組成一個新的stream
List<Integer> list = new ArrayList<>(); list.add(12); list.add(18); list.add(22); list.add(30); //i類似迭代器中的迭代變數,變數名任意取,這裡的意思是過濾數字大於等於18的元素,組成一個新的集合 List<Integer> result = list.stream().filter(i -> i >= 18).collect(Collectors.toList()); System.out.println("result:" + result);//result:[18, 22, 30]
map()和flatMap()
map():將一個流元素按照一定規則轉換為另一個元素,適用於1對1時
//這些user都是Users的物件,裡面有id和name等屬性 List<Users> list = Arrays.asList(user1, user2, user3, user4); //這裡的規則是拿取每個使用者的name屬性,這裡轉換成為了一個字串,由collect方法連線成一個字串型別的集合 List<String> names = list.stream().map(user -> user.getName()).collect(Collectors.toList()); System.out.println(names);//["張三", "李四", "王五", "趙六"]
flatMap():這裡適用於1對多
//由多個Integer型別組成的集合組合而成一個大集合 List<List<Integer>> list = Arrays.asList(Arrays.asList(1), Arrays.asList(2, 3), Arrays.asList(4, 5, 6)); //由flatMap方法將list集合中每一個元素變成流從而組成一個大的流,並由collect方法連線起來 List<Integer> result = list.stream().flatMap(i -> i.stream()).collect(Collectors.toList()); System.out.println(result);//[1, 2, 3, 4, 5, 6]
forEach()
該方法傳入一個lambda表示式,遍歷流的每一個元素,讓每個元素都執行lambda表示式
List<Users> list = Arrays.asList(user1, user2, user3, user4); //jdk8以前: for(u : list){ if(u.getAge() >= 18){ System.out.println(u.getName()); } } //jdk8: list.stream().forEach(u -> { if(u.getAge() >= 18){ System.out.println(u.getName()); } });
reduce()
這個方法的主要作用是把 Stream 元素組合起來。它提供一個起始值(種子),然後依照運算規則(BinaryOperator),和前面 Stream 的第一個、第二個、第 n 個元素組合。從這個意義上說,字串拼接、數值的 sum、min、max、average 都是特殊的 reduce。也有沒有起始值的情況,這時會把 Stream 的前面兩個元素組合起來,返回的是 Optional。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); //求list集合的元素之和, 有起始值,result = 10 int result = liststream().reduce(0, Integer::sum); //result = 15 // 求最小值,minValue = 1 int minValue = list.stream().reduce(Double.MAX_VALUE, Double::min); // 求最大值,maxValue = 5 int maxValue = list.stream().reduce(Double.MAX_VALUE, Double::min); // 求和,sumValue = 10, 無起始值,返回Optional,所以有get()方法 sumValue = list.stream().reduce(Integer::sum).get();