Stream【資料流】的基本使用
阿新 • • 發佈:2022-12-10
Stream:資料流
中間方法: filter【過濾】 limit【獲取前幾個資料】 skip【跳過前幾個資料】
distinct【去重】 concat【合併】 map【轉換流中的資料型別】
終結方法: foreach 【遍歷】 count【統計】 toArray【收集資料到陣列中】
collect【收集資料到集合中】
注意點:中間方法返回一個新的Stream流,原本的Stream流只能使用一次,建議使用鏈式程式設計
修改Stream流中的資料,不會影響原來的資料
1package com.Lucky; 2 3 import java.util.*; 4 import java.util.function.Function; 5 import java.util.function.IntFunction; 6 import java.util.stream.Collectors; 7 import java.util.stream.Stream; 8 9 /* 10 Stream:資料流 11 中間方法: filter【過濾】 limit【獲取前幾個資料】 skip【跳過前幾個資料】12 distinct【去重】 concat【合併】 map【轉換流中的資料型別】 13 14 終結方法: foreach 【遍歷】 count【統計】 toArray【收集資料到陣列中】 15 collect【收集資料到集合中】 16 17 注意點:中間方法返回一個新的Stream流,原本的Stream流只能使用一次,建議使用鏈式程式設計 18 修改Stream流中的資料,不會影響原來的資料 19 */ 20 public classStreamDemo1 { 21 /** 22 * 要求: 1.將姓張的開頭的元素新增到新集合中 23 * 2.將姓張的開頭並且長度為3的元素新增到新集合中 24 * 3.遍歷列印最終結果 25 */ 26 27 28 public static void main(String[] args) { 29 //1.原始做法 30 System.out.println("-------- //1.原始做法---------"); 31 ArrayList<String> arr1=new ArrayList<>(); 32 Collections.addAll(arr1,"張三","張無忌","張斷三","唯易","王八蛋","賽亞人","張天"); 33 34 35 ArrayList<String> arr2=new ArrayList<>(); 36 for (String s : arr1) { 37 if(s.startsWith("張")){ //以張開頭的資料 38 arr2.add(s); 39 } 40 } 41 ArrayList<String> arr3=new ArrayList<>(); 42 for (String m : arr2) { 43 if(m.length()==3){ //以張開頭的資料並且長度為3 44 arr3.add(m); 45 } 46 } 47 48 System.out.println(arr1); 49 System.out.println(arr2); 50 System.out.println(arr3); 51 52 53 System.out.println("-------- //2.Stream資料流做法---------"); 54 System.out.println("------- filter【過濾】-----------"); 55 arr1.stream().filter(name->name.startsWith("張")).filter(name->name.length()==3) 56 .forEach(strName-> System.out.println(strName)); 57 58 59 System.out.println("------- limit【獲取前幾個資料】-----------"); 60 arr1.stream().limit(5).limit(3) 61 .forEach(val-> System.out.println(val)); 62 63 System.out.println("------- skip【跳過前幾個資料】-----------"); 64 arr1.stream().skip(3).skip(3) 65 .forEach(val-> System.out.println(val)); 66 67 System.out.println("------- distinct【去重】-----------"); 68 ArrayList<String> arr=new ArrayList<>(); 69 Collections.addAll(arr,"張三","王八蛋","賽亞人","王八蛋","賽亞人","張三","精英"); 70 arr.stream().distinct().forEach(val-> System.out.println(val)); 71 72 System.out.println("------- concat【合併】-----------"); 73 Stream.concat(arr.stream(),arr1.stream()).forEach(val-> System.out.println(val)); 74 75 76 System.out.println("------- map 【轉換流中的資料型別】-----------"); 77 ArrayList<String> arrStr=new ArrayList<>(); 78 Collections.addAll(arrStr,"BUG=999+","王八蛋=666+","賽亞人=555-"); 79 /* 80 String:原本流的資料型別 81 Integer:要轉換成的資料型別 82 */ 83 arrStr.stream().map(new Function<String, Integer>() { 84 @Override 85 public Integer apply(String s) { 86 //將字串轉換成字串陣列 87 String[] strArr=s.split("="); 88 String tempVar=strArr[1]; //獲取=之後的資料 例如:999+ 89 //擷取字串 90 tempVar = tempVar.substring(0,tempVar.length()-1); 91 //轉換成int型別 92 int age=Integer.parseInt(tempVar); 93 94 return age; 95 } 96 }).forEach(val-> System.out.println(val)); 97 98 99 System.out.println("---//lamda表示式寫法 轉換成int型別----"); 100 arrStr.stream().map(s->Integer.parseInt(s.split("=")[1].substring(0,3))) 101 .forEach(val-> System.out.println(val)); 102 103 104 105 106 107 ///////////////////////////////////////////////////////////////////////////////////////////// 108 System.out.println("===============終結方法======================="); 109 /** 110 * 終結方法: foreach 【遍歷】 count【統計】 toArray【收集資料到陣列中】 111 * collect【收集資料到集合中】 112 */ 113 arr1.stream().forEach(strName-> System.out.println(strName)); 114 115 System.out.println(arr.stream().count()); 116 117 System.out.println("-------toArray------"); 118 Object[] objects = arrStr.stream().toArray(); 119 System.out.println(Arrays.toString(objects)); 120 121 /* 122 new IntFunction<具體型別的陣列> 123 value :流中資料的個數 124 返回值 :具體型別的陣列 125 */ 126 String[] atr= arr1.stream().toArray(new IntFunction<String[]>() { 127 @Override 128 public String[] apply(int value) { 129 return new String[value]; 130 } 131 }); 132 System.out.println(Arrays.toString(atr)); //轉換成String字串打印出來 133 134 //使用lamda表示式 135 String[] v= arr1.stream().toArray(value-> new String[value]); 136 System.out.println(Arrays.toString(v)); //轉換成String字串打印出來 137 138 139 System.out.println("-------collect:------"); 140 141 ArrayList<String> OK=new ArrayList<>(); 142 Collections.addAll(OK,"張三-男-500","王八蛋-男-60","唯易-男-22","小微-女-21","李四-男-300"); 143 144 //要求:將男的收集到list集合中 145 List<String> collectList = OK.stream().filter(val -> "男".equals(val.split("-")[1])) 146 .collect(Collectors.toList()); 147 System.out.println(collectList); 148 149 //要求:將男的收集到Set集合中【跟list集合不同的地方:自動去重】 150 Set<String> collectSet = OK.stream().filter(val -> "男".equals(val.split("-")[1])) 151 .collect(Collectors.toSet()); 152 System.out.println(collectSet); 153 154 155 System.out.println("-------注意點:要儲存在Map集合中,鍵不能重複,不然就報錯----------"); 156 System.out.println("---初級:匿名內部類寫法----"); 157 158 //要求:將男的收集到Map集合中【要確定哪個作為鍵,哪個作為值】 159 // 用姓名作為鍵,將年齡作為值 張三-男-500 160 Map<String, Integer> collectMap = OK.stream().filter(val -> "男".equals(val.split("-")[1])) 161 .collect(Collectors.toMap( 162 //引數一:定義鍵的生成規則 163 // new Function<原本流中的資料型別, 鍵的資料型別> 164 // apply(原本流中的資料型別 s) 165 // return: 返回生成的鍵 166 new Function<String, String>() { 167 @Override 168 public String apply(String s) { 169 String name = s.split("-")[0]; 170 return name; 171 } 172 }, 173 //引數二:定義值的生成規則 174 // new Function<原本流中的資料型別, 值的資料型別> 175 // apply(原本流中的資料型別 流裡面的每一個數據) 176 // return: 返回生成的值 177 new Function<String, Integer>() { 178 @Override 179 public Integer apply(String s) { 180 String age = s.split("-")[2]; 181 return Integer.parseInt(age); 182 } 183 })); 184 System.out.println(collectMap); 185 186 187 System.out.println("---高階:lamda表示式寫法----"); 188 Map<String, Integer> collectLam = OK.stream().filter(val -> "男".equals(val.split("-")[1])) 189 .collect(Collectors.toMap(ki ->ki.split("-")[0], 190 vi ->Integer.parseInt(vi.split("-")[2]))); 191 System.out.println(collectLam); 192 } 193 }