| 來源 | API | 示例 |
| Collection | collection.stream() | list.stream() |
| 陣列 | Stream.of(arr) / Arrays.stream(arr) | Stream.of(arr), Arrays.stream(arr, 0, 2) |
| 任意元素 | Stream.of(v1, v2...) | Stream.of("a","b","c") |
無限流:Stream.generate(Supplier<T>)、Stream.iterate(seed, UnaryOperator)
二、Stream → 陣列/集合/String/Map
toArray
Object[] objArr = stream.toArray();
String[] strArr = stream.toArray(String[]::new); // 構造器引用
toCollection
List<String> list = stream.collect(Collectors.toList());
Set<String> set = stream.collect(Collectors.toSet());
ArrayList<String> al = stream.collect(Collectors.toCollection(ArrayList::new));
字符串拼接
String joined = stream.collect(Collectors.joining()); // 直接拼接
String csv = stream.collect(Collectors.joining(",")); // 分隔符拼接
toMap
Map<String, Integer> map = stream.collect(Collectors.toMap(
Function.identity(), // key
x -> 0, // value
(oldV, newV) -> oldV, // key 衝突策略
TreeMap::new // 指定 Map 實現
));
三、filter(Predicate) - 選擇而非過濾
Predicate<String> startsWithP = s -> s.startsWith("p");
stream.filter(startsWithP).forEach(System.out::println);
最佳實踐:將 Lambda 提取為 Predicate 變量,複雜條件組合更清晰。
四、map(Function) - 元素轉換
stream.map(String::toUpperCase).forEach(System.out::println);
每個元素獨立轉換,一對一映射。
五、reduce - 聚合歸約
Optional<Integer> sumOpt = Stream.of(1,2,3,4,5).reduce((x,y) -> x+y); // 15
Integer sum = Stream.of(1,2,3,4,5).reduce(0, Integer::sum); // 15,有初值無 Optional
簡化形式要求:BinaryOperator<T>(參數與返回類型一致)。
六、Optional - 空值安全容器
| 方法 | 語義 |
ifPresent(Consumer) | 存在則執行,否則無操作(推薦) |
orElse(T) | 存在返回值,否則返回默認值 |
Optional<String> opt = stream.filter(s -> s.startsWith("p")).findFirst();
opt.ifPresent(System.out::println);
String val = opt.orElse("default");
七、limit/skip/concat - 切片與合併
stream.limit(2); // 取前 2
stream.skip(2); // 跳過前 2
Stream.concat(s1, s2); // 合併兩個流
八、聚合終端操作
long count = stream.count();
Optional<T> max = stream.max(Comparator);
Optional<T> min = stream.min(Comparator);
Optional<T> first = stream.filter(...).findFirst(); // 串行首個
Optional<T> any = stream.parallel().filter(...).findAny(); // 並行任意
boolean anyMatch = stream.anyMatch(predicate); // 存在滿足
boolean allMatch = stream.allMatch(predicate); // 全部滿足
boolean noneMatch = stream.noneMatch(predicate); // 全部不滿足
並行流提示:parallel() 可提升多核性能,但需注意線程安全、無狀態操作、數據源可分割性。
Stream API 核心哲學:聲明式數據處理,將「怎麼做」交給庫,業務代碼專注「做什麼」。
- 上一篇文章: Java FTP 工具類封裝:上傳、下載、列表、刪除、目錄創建完整實現
- 下一篇文章: Java 中聚合與組合的區別與聯繫:從「Has-a」關係到 UML 圖解
Copyright ©
程式碼之家 All Rights Reserved