首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Stream API 實戰指南(第三章):創建、轉換、過濾、聚合、Optional 全解析

     編輯:Java 綜合教學

Java Stream API 實戰指南(第三章):創建、轉換、過濾、聚合、Optional 全解析

引例:一行代碼完成去重、過濾、排序、收集

Arrays.asList("zhaojigang","nana","tianya","nana")
    .stream()
    .distinct()
    .filter(s -> !s.equals("tianya"))
    .sorted(String::compareTo)
    .collect(Collectors.toList())
    .forEach(System.out::println);

易錯點:filter 是選擇滿足條件的元素,而非「過濾掉」。

一、創建 Stream 三大來源

無限流: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 - 空值安全容器

來源API示例
Collectioncollection.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")
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 核心哲學:聲明式數據處理,將「怎麼做」交給庫,業務代碼專注「做什麼」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法語義
ifPresent(Consumer)存在則執行,否則無操作(推薦)
orElse(T)存在返回值,否則返回默認值