溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java Steam的用法

發布時間:2021-06-25 11:56:47 來源:億速云 閱讀:918 作者:chen 欄目:編程語言
# Java Stream的用法

## 一、Stream概述

Java 8引入的Stream API是處理集合數據的革命性工具,它允許開發者以聲明式方式操作數據集合。Stream不是數據結構,而是對數據源(如集合、數組等)的高級抽象,支持鏈式函數式操作。

核心特點:
- **惰性執行**:中間操作不會立即執行,只有遇到終止操作時才觸發計算
- **不可復用**:每個Stream只能被消費一次
- **并行能力**:只需調用`parallel()`即可實現并行處理

## 二、Stream創建方式

### 1. 從集合創建
```java
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();  // 順序流
Stream<String> parallelStream = list.parallelStream();  // 并行流

2. 從數組創建

String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);

3. 使用Stream靜態方法

Stream<String> stream = Stream.of("a", "b", "c");
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2);  // 無限流
Stream<Double> randomStream = Stream.generate(Math::random);  // 生成流

三、中間操作

中間操作返回新的Stream,可以連續調用:

1. 過濾操作

stream.filter(s -> s.startsWith("a"))  // 過濾以a開頭的元素
      .distinct()                     // 去重
      .skip(1)                        // 跳過前N個元素
      .limit(5);                     // 限制元素數量

2. 映射操作

stream.map(String::toUpperCase)       // 元素轉換
      .mapToInt(String::length)       // 轉換為數值流
      .flatMap(s -> Stream.of(s.split("")))  // 扁平化流

3. 排序操作

stream.sorted()                       // 自然排序
      .sorted(Comparator.reverseOrder())  // 自定義排序

四、終止操作

1. 遍歷消費

stream.forEach(System.out::println);

2. 匹配檢查

boolean anyMatch = stream.anyMatch(s -> s.contains("a"));
boolean allMatch = stream.allMatch(s -> s.length() > 3);
boolean noneMatch = stream.noneMatch(s -> s.isEmpty());

3. 查找操作

Optional<String> first = stream.findFirst();
Optional<String> any = stream.findAny();

4. 歸約統計

Optional<String> concat = stream.reduce(String::concat);
long count = stream.count();
IntSummaryStatistics stats = stream.mapToInt(String::length).summaryStatistics();

5. 收集結果

List<String> list = stream.collect(Collectors.toList());
Set<String> set = stream.collect(Collectors.toSet());
String joined = stream.collect(Collectors.joining(","));
Map<String, Integer> map = stream.collect(Collectors.toMap(
    Function.identity(), 
    String::length
));

五、數值流特化

處理原始類型時更高效的變體:

IntStream intStream = IntStream.range(1, 100);  // 1-99
DoubleStream doubleStream = DoubleStream.of(1.1, 2.2);
LongStream longStream = LongStream.generate(() -> new Random().nextLong());

六、并行流使用

list.parallelStream()
    .filter(s -> s.length() > 3)
    .forEach(System.out::println);

注意事項: - 確保操作是線程安全的 - 避免有狀態的操作 - 數據量小時可能降低性能

七、常用Collectors工具方法

方法 說明
toList() 收集為List
toSet() 收集為Set
toMap() 收集為Map
groupingBy() 分組收集
partitioningBy() 分區收集
joining() 字符串連接
counting() 計數
summarizingInt() 統計匯總

八、實戰案例

案例1:數據統計

List<Product> products = ...;
DoubleSummaryStatistics stats = products.stream()
    .mapToDouble(Product::getPrice)
    .summaryStatistics();
System.out.println("平均價格: " + stats.getAverage());

案例2:分組處理

Map<Category, List<Product>> byCategory = products.stream()
    .collect(Collectors.groupingBy(Product::getCategory));

案例3:多級分組

Map<Category, Map<String, List<Product>>> multiGroup = products.stream()
    .collect(Collectors.groupingBy(
        Product::getCategory,
        Collectors.groupingBy(p -> p.getPrice() > 100 ? "高價" : "普通")
    ));

九、注意事項

  1. 流只能消費一次:重復操作會拋出IllegalStateException
  2. 避免副作用:操作應保持無狀態
  3. 空指針防護:使用Optional處理可能為空的結果
  4. 性能考慮
    • 小數據量優先使用循環
    • 大數據量考慮并行流
  5. 調試技巧:使用peek()方法觀察流經的元素

十、總結

Java Stream API通過函數式編程范式: - 使集合操作更簡潔直觀 - 提供強大的數據轉換能力 - 內置并行處理支持 - 提升代碼可讀性和維護性

合理運用Stream可以顯著提升開發效率,但需注意其適用場景和潛在的性能影響。建議結合具體業務需求,在命令式編程和函數式編程之間做出平衡選擇。 “`

注:本文實際約1700字,完整覆蓋了Stream的核心概念、創建方式、操作類型、使用技巧和注意事項。如需擴展具體部分,可以進一步補充更多示例或性能優化建議。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女