Stream Api
主要特點
不存儲數據:Stream 本身不會存儲元素。它只是在原有的數據源上(例如集合、數組)進行操作的工具。
 
函數式編程:Stream API 大量使用 Lambda 表達式,支持函數式編程的概念,使得編寫的代碼既簡潔又易於理解。
 
惰性求值:很多 Stream 操作都是延遲執行的,只有在需要結果的時候才會實際執行,這有助於優化性能。
 
可串行可並行:Stream 可以進行串行處理,也可以輕鬆轉換為並行處理,利用多核處理器來加速數據處理速度。
 
這些操作會返回一個新的 Stream 對象。常見的中間操作包括 filter(過濾)、map(映射)、sorted(排序)等。
特點
java 允許 0個或多個 Intermediate Operations
 
大型數據的 Operations 順序會有影響: 先 filter, 後sort() 或 map()
 
非常大的數據集使用 ParallelStream,啟用多個thread`
 
stream().filter()
filter:過濾元素
從用戶名單中選出以特定字母開頭的用戶,例如為了發送定制化的郵件。
1 2 3 4 5
   | List<String> names=Arrays.asList("John","Jane","Adam","Diana");         List<String> filteredNames=names.stream()         .filter(name->name.startsWith("J"))         .collect(Collectors.toList());
 
 
  | 
 
stream().map()
map:將元素轉換成其他形式或提取信息。map:將元素轉換成其他形式或提取。
從用戶名生成電子郵件地址。
1 2 3 4 5
   | List<String> emails=names.stream()         .map(name->name.toLowerCase()+"@example.com")         .collect(Collectors.toList());
 
 
 
  | 
 
stream().sort()
sorted:對元素進行排序。
對產品價格或者用戶生成的數據進行排序,以便後續處理。
1 2 3 4 5
   | List<Integer> numbers=Arrays.asList(4,2,3,1,5);         List<Integer> sortedNumbers=numbers.stream()         .sorted()         .collect(Collectors.toList());
 
 
  | 
 
終端操作 terminal operator
這些操作會產生一個結果或副作用,例如 forEach(遍歷)、collect(收集到集合)、count(計數)、reduce(累加)等。
特點
只允許一個終端操作
 
foreach()對每個元素做相同的操作
 
Collect將元素保存到集合中
 
其他選項將stream縮減為單一結果
 
stream().foreach()
forEach:對每個元素執行操作。
遍歷用戶名單執行某些操作,例如發送通知。
1 2
   | names.stream()         .forEach(System.out::println);
 
  | 
 
stream().collect
collect:將流轉換成其他形式,如列表或集合。
將過濾後的結果集合起來,以供後續處理。
1 2
   | List<String> collectedNames=names.stream()         .collect(Collectors.toList());
 
  | 
 
stream().reduce
reduce:將所有元素合併為一個結果。
計算一系列交易的總和。
1 2 3
   | Integer sum=numbers.stream()         .reduce(0,Integer::sum);
 
 
  | 
 
綜合例子
假設我們有一個訂單列表,每個訂單包含價格和類別,我們想要計算每個類別的總銷售額
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
   | package Collection.Stream;
  import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors;
  class Order {     String category;     double price;
      public Order(String category, double price) {         this.category = category;         this.price = price;     }
      public String getCategory() {         return category;     }
      public double getPrice() {         return price;     } }
  class Main {     public static void main(String[] args) {         List<Order> orders = Arrays.asList(                 new Order("Electronics", 200.0),                 new Order("Clothing", 75.0),                 new Order("Electronics", 150.0),                 new Order("Toys", 50.0)         );
          Map<String, Double> totalSalesByCategory = orders.stream()                 .collect(Collectors.groupingBy(Order::getCategory,                         Collectors.summingDouble(Order::getPrice)));         System.out.println(totalSalesByCategory);     } }
 
 
  |