- 1. stream流的3個特性
-
- (1) stream流不存儲資料
- (2) stream不改變資料源
- (3) stream不可重複使用
- 2. 生成流的方式
-
- (1) Array.stream()
- (2) Stream.of()
- (3) 對象.stream()
- 3. 中間節點(懶節點)與終值節點
-
- (1) 中間節點/懶節點的使用示例
- (2) 懶節點+終值節點
- (3) 區分中間節點與終值節點的方法
- 4. stream流的使用示例及特性
-
- (1) 節點的責任鍊模式
-
- ① 執行每個節點方法:peek()
- ② 執行最後一個節點:foreach()
- (2) 上一個節點會影響下一個節點
-
- ① 過濾:filter()
- ② 轉換/映射:map()
- ③ 去重:distinct()
- 5. Stream的采集功能
stream流式程式設計
1. stream流的3個特性
(1) stream流不存儲資料
(2) stream不改變資料源
stream可以看作一根管道,用于資料的轉換,是以不會存儲資料,也不會影響原來的資料
除了過濾、排序、采集外,還有分組等等功能,這也就是stream流式程式設計提供的功能
(3) stream不可重複使用
因為stream是一根管道,不可重複使用就是stream用完一次之後,資料就輸出了
示例
Stream stream1 = Stream.of(1,2,3);
//建立stream2過濾stream1
Stream stream2 = stream1.filter(s->s.equals(1));
//下句代碼會出錯,因為stream1流用過一次,消失了
Stream stream3 = stream1.filter(s->s.equals(1));
2. 生成流的方式
(1) Array.stream()
Array的靜态方法
例如
Arrays.stream(new int[]{1,2,3}); //使用Array的靜态方法建立流
(2) Stream.of()
Stream的靜态方法,可以傳入任何類型
(3) 對象.stream()
stream()方法是Collection接口裡的預設方法 ,是以Collection所有的子類和子接口都可以使用.stream()
例如
Collection collection = new ArrayList();
collection.stream(); // 使用Collection類裡的成員方法stream()方式建立流
3. 中間節點(懶節點)與終值節點
(1) 中間節點/懶節點的使用示例
懶節點不會自動執行,是以下例代碼不會列印hello
public static void main(String[] args) {
List list = new ArrayList();
Stream.of(list).filter(a->{
System.out.println("hello");
return true;
}); //沒有列印結果
}
(2) 懶節點+終值節點
這時在最後加了.toArray()方法,相當于加上了終值節點,那麼此時終值節點+前面的節點都會執行
public static void main(String[] args) {
List list = new ArrayList();
Stream.of(list).filter(a->{
System.out.println("hello");
return true;
}).toArray(); //列印輸出hello
}
(3) 區分中間節點與終值節點的方法
進入Stream流的源碼,按快捷鍵ctrl+f12
隻要方法傳回的是Stream,基本都是中間節點,其餘就是終值節點
4. stream流的使用示例及特性
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AppleStore {
int id; //編号
String color; //顔色
double weight; //重量
String origin; //産地
}
(1) 節點的責任鍊模式
① 執行每個節點方法:peek()
節點會挨個執行,也稱作責任鍊模式
public class StreamTest {
private static List<AppleStore> appleStores = new ArrayList();
static {
appleStores.add(new AppleStore(1,"red",1.2,"重慶"));
appleStores.add(new AppleStore(2,"red",1.5,"四川"));
appleStores.add(new AppleStore(3,"yellow",2.6,"重慶"));
appleStores.add(new AppleStore(4,"yellow",2.9,"四川"));
appleStores.add(new AppleStore(5,"red",3.2,"杭州"));
}
public static void main(String[] args) {
//peek()是執行每個節點的方法
//peek裡的方法會挨個執行,也就是節點會挨個執行,也稱作責任鍊模式
appleStores.stream().peek(appleStore -> System.out.println(appleStore.getColor())) //列印蘋果的顔色
.peek(appleStore -> System.out.println(appleStore.getWeight())) //列印蘋果的重量
.peek(appleStore -> appleStore.getOrigin()) //列印蘋果的産地
.toArray();
}
}
② 執行最後一個節點:foreach()
foreach功能和peek相同,不同是foreach是終值節點,也就是不能再往下繼續執行
appleStores.stream().peek(apple -> System.out.println(apple.getId())) //列印蘋果編号
.peek(apple -> System.out.println(apple.getColor())) //列印蘋果顔色
.forEach(sout-> System.out.println("節點一次周遊執行完畢"));
(2) 上一個節點會影響下一個節點
影響方式:過濾、轉換/映射、去重
① 過濾:filter()
appleStores.stream().filter(appleStore -> appleStore.getColor().equals("red")) //過濾出紅色的蘋果
.peek(appleStore -> System.out.println(appleStore)) //到第二個節點隻有紅色蘋果的資料了
.toArray();
② 轉換/映射:map()
//此時資料全部變成了String字元串 因為map中的方法是getColor(),映射成為的是String
appleStores.stream().map(appleStore -> appleStore.getColor()) //擷取蘋果的顔色
.peek(color -> System.out.println(color))
.toArray();
③ 去重:distinct()
appleStores.stream().map(appleStore -> appleStore.getColor()) //擷取蘋果的顔色
.distinct() //去重
.peek(color -> System.out.println(color))
.toArray();
5. Stream的采集功能
Stream采集功能分為List、map、group by、數組、求最大值、求任意值等,這裡就不一一列舉了
用一個綜合例子來說明其餘功能
List<Integer> collect = appleStores.stream() // 擷取appleStores的流
.map(appleStore -> appleStore.getId()) // 轉換功能:擷取id,從List<AppleStore>轉換成了List<int>
.sorted() // 從小到大排序 (本質是調用compareTo()方法,是以類要實作CompareAble接口)
.limit(3) // 取前三個元素
.collect(Collectors.toList()); //将stream流轉回List集合
stream流的常用方法