# 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(); // 并行流
// 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();
IllegalStateException
String[] array = {"Java", "Python", "Go"};
Stream<String> arrayStream = Arrays.stream(array);
// 指定范圍[起始索引,結束索引)
Stream<String> rangeStream = Arrays.stream(array, 1, 3); // 輸出Python,Go
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<String> stringStream = Stream.of("A", "B", "C");
// 基本類型會自動裝箱
Stream<Integer> intStream = Stream.of(1, 2, 3);
// 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
Stream<Object> emptyStream = Stream.empty();
try (Stream<String> lines = Files.lines(Paths.get("data.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
// 統計文件中的非空行數
long count = Files.lines(Paths.get("log.txt"))
.filter(line -> !line.trim().isEmpty())
.count();
IntStream charStream = "Hello".chars();
Stream<String> wordStream = Pattern.compile(",")
.splitAsStream("a,b,c");
Stream.Builder<String> builder = Stream.builder();
Stream<String> customStream = builder.add("first")
.add("second")
.build();
創建方式 | 適用場景 | 性能特點 |
---|---|---|
集合.stream() | 常規集合操作 | 中等初始化開銷 |
Arrays.stream() | 數組處理 | 最優性能 |
Stream.generate() | 無限序列 | 需配合limit使用 |
Files.lines() | 大文件處理 | 低內存占用 |
List<Integer> numbers = /* 大量數據 */;
// 適合并行處理的條件:
// 1. 數據量 > 1萬
// 2. 處理邏輯耗時
// 3. 無共享狀態
long sum = numbers.parallelStream()
.filter(n -> n % 2 == 0)
.mapToInt(n -> n * 2)
.sum();
// 統計ERROR級別的日志行數
Files.lines(Paths.get("app.log"))
.filter(line -> line.contains("ERROR"))
.count();
// 生成100個隨機ID
List<String> testIds = Stream.generate(() -> UUID.randomUUID().toString())
.limit(100)
.collect(Collectors.toList());
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()
正確選擇創建方式能提升代碼可讀性和執行效率。
Stream.toList()
方法”`
注:本文實際約1750字,包含: 1. 7個主要章節 2. 15個代碼示例 3. 性能對比表格 4. 3個實際應用案例 5. 擴展閱讀建議
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。