溫馨提示×

溫馨提示×

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

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

Java8中怎么利用Stream 創建流

發布時間:2021-07-28 15:23:42 來源:億速云 閱讀:189 作者:Leah 欄目:大數據
# Java8中怎么利用Stream創建流

## 前言

Java 8引入的Stream API是處理集合數據的革命性工具,它允許開發者以聲明式方式處理數據集合。本文將深入探討5種核心的Stream創建方式,并通過典型場景示例展示其應用技巧。

## 一、集合創建流(最常用方式)

### 1. Collection接口的默認方法

所有實現`java.util.Collection`接口的類(List/Set/Queue等)都可通過`stream()`方法創建順序流:

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

2. 不同集合類型的示例

// Set創建流示例
Set<Integer> numbers = new HashSet<>(Arrays.asList(1, 2, 3));
Stream<Integer> numStream = numbers.stream();

// Queue創建流示例
Queue<String> queue = new LinkedList<>(Arrays.asList("x", "y", "z"));
Stream<String> queueStream = queue.stream();

3. 注意事項

  • 并行流適合大數據量且線程安全的操作
  • 流只能消費一次,重復使用會拋出IllegalStateException

二、數組創建流

1. Arrays.stream()靜態方法

String[] array = {"Java", "Python", "Go"};
Stream<String> arrayStream = Arrays.stream(array);

// 指定范圍[起始索引,結束索引)
Stream<String> rangeStream = Arrays.stream(array, 1, 3); // 輸出Python,Go

2. 基本類型數組特化流

Java 8為基本類型提供了專門的流實現:

int[] intArray = {1, 2, 3, 4};
IntStream intStream = Arrays.stream(intArray);

double[] doubles = {1.1, 2.2};
DoubleStream doubleStream = Arrays.stream(doubles);

三、Stream類靜態工廠方法

1. Stream.of()可變參數

Stream<String> stringStream = Stream.of("A", "B", "C");

// 基本類型會自動裝箱
Stream<Integer> intStream = Stream.of(1, 2, 3);

2. 生成無限流

// 1. generate方法
Stream<String> randomStream = Stream.generate(() -> UUID.randomUUID().toString())
                                  .limit(5);

// 2. iterate方法
Stream<Integer> sequence = Stream.iterate(0, n -> n + 2)
                                .limit(10); // 0,2,4...18

3. 空流創建

Stream<Object> emptyStream = Stream.empty();

四、文件與IO創建流

1. Files.lines()讀取文件

try (Stream<String> lines = Files.lines(Paths.get("data.txt"))) {
    lines.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

2. 按行處理大文件優勢

// 統計文件中的非空行數
long count = Files.lines(Paths.get("log.txt"))
                 .filter(line -> !line.trim().isEmpty())
                 .count();

五、其他特殊創建方式

1. 字符串分割為字符流

IntStream charStream = "Hello".chars();

2. 正則表達式分割流

Stream<String> wordStream = Pattern.compile(",")
                                  .splitAsStream("a,b,c");

3. 構建器模式創建

Stream.Builder<String> builder = Stream.builder();
Stream<String> customStream = builder.add("first")
                                    .add("second")
                                    .build();

六、流創建的性能考量

1. 不同創建方式的性能對比

創建方式 適用場景 性能特點
集合.stream() 常規集合操作 中等初始化開銷
Arrays.stream() 數組處理 最優性能
Stream.generate() 無限序列 需配合limit使用
Files.lines() 大文件處理 低內存占用

2. 并行流使用建議

List<Integer> numbers = /* 大量數據 */;
// 適合并行處理的條件:
// 1. 數據量 > 1萬
// 2. 處理邏輯耗時
// 3. 無共享狀態
long sum = numbers.parallelStream()
                 .filter(n -> n % 2 == 0)
                 .mapToInt(n -> n * 2)
                 .sum();

七、實際應用案例

案例1:統計日志錯誤

// 統計ERROR級別的日志行數
Files.lines(Paths.get("app.log"))
     .filter(line -> line.contains("ERROR"))
     .count();

案例2:生成測試數據

// 生成100個隨機ID
List<String> testIds = Stream.generate(() -> UUID.randomUUID().toString())
                           .limit(100)
                           .collect(Collectors.toList());

案例3:多數據源合并

Stream<String> combined = Stream.concat(
    list1.stream(),
    list2.stream()
);

總結

Java 8 Stream創建方式多樣,主要分為: 1. 集合/數組轉換(最常用) 2. Stream靜態工廠方法 3. 文件IO生成 4. 特殊構建方式

選擇建議: - 集合數據優先用collection.stream() - 數組數據用Arrays.stream() - 大文件用Files.lines() - 無限流用Stream.iterate()/generate()

正確選擇創建方式能提升代碼可讀性和執行效率。

擴展閱讀

”`

注:本文實際約1750字,包含: 1. 7個主要章節 2. 15個代碼示例 3. 性能對比表格 4. 3個實際應用案例 5. 擴展閱讀建議

向AI問一下細節

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

AI

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