1. 程式人生 > 實用技巧 >Stream的簡單介紹和List的流操作

Stream的簡單介紹和List的流操作

stream()是jdk8的新特性,得到的是Stream(流)物件,使得可以將陣列集合等資料使用類似迭代器的方式進行操作,使用流時,資料只能單次遍歷,不能逆流。

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();

參考資料:https://blog.csdn.net/lidai352710967/article/details/82496783