天天看點

java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. Stream的采集功能

  • 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流式程式設計提供的功能

java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. Stream的采集功能

(3) stream不可重複使用

因為stream是一根管道,不可重複使用就是stream用完一次之後,資料就輸出了

java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. 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的靜态方法

java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. Stream的采集功能

例如

Arrays.stream(new int[]{1,2,3}); //使用Array的靜态方法建立流

(2) Stream.of()

Stream的靜态方法,可以傳入任何類型

java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. 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,基本都是中間節點,其餘就是終值節點

java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. 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();
    }
}
           
java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. Stream的采集功能

② 執行最後一個節點: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("節點一次周遊執行完畢"));
           
java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. Stream的采集功能

(2) 上一個節點會影響下一個節點

影響方式:過濾、轉換/映射、去重

① 過濾:filter()

appleStores.stream().filter(appleStore -> appleStore.getColor().equals("red")) //過濾出紅色的蘋果
                .peek(appleStore -> System.out.println(appleStore)) //到第二個節點隻有紅色蘋果的資料了
                .toArray();
           
java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. Stream的采集功能

② 轉換/映射: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();
           
java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. Stream的采集功能

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流的常用方法

java的stream流式程式設計1. stream流的3個特性2. 生成流的方式3. 中間節點(懶節點)與終值節點4. stream流的使用示例及特性5. Stream的采集功能