Java 8 為 String 新增 chars() 返回 IntStream,配合 forEach、filter、mapToObj 等流操作,字符級處理變得聲明式且高效。本文結合方法引用的四種形式,演示字符串遍歷、過濾、轉換全流程。
String str = "w00t";
// 1. Lambda 打印字符碼點
str.chars().forEach(cp -> System.out.println(cp));
// 輸出: 119 48 48 116 (int 碼點)
// 2. 方法引用:System.out::println (實例方法引用)
str.chars().forEach(System.out::println); // 同樣輸出碼點
// 3. 自定義轉換方法
private static void printChar(int cp) { System.out.println((char) cp); }
// 類方法引用:IterateString::printChar
str.chars().forEach(IterateString::printChar);
// 輸出: w 0 0 t
// 4. 一體化:mapToObj 轉 Character 再打印
str.chars()
.mapToObj(cp -> Character.valueOf((char) cp))
.forEach(System.out::println);
// Lambda
str.chars().filter(cp -> Character.isDigit(cp)).forEach(IterateString::printChar);
// 靜態方法引用:Character::isDigit
str.chars().filter(Character::isDigit).forEach(IterateString::printChar);
// 輸出: 0 0
| 形式 | 語法 | 示例 | 參數路由規則 |
|---|---|---|---|
| 靜態方法 | Class::staticMethod | Character::isDigit | 參數直接傳給靜態方法 |
| 實例方法(特定對象) | instance::method | System.out::println | 參數作為方法參數 |
| 實例方法(任意對象) | Class::method | String::toUpperCase | 第一個參數作為調用者,其餘作為參數 |
| 構造器 | Class::new | ArrayList::new | 參數傳給構造器 |
// Double 同時有 toString() 實例方法 和 toString(double) 靜態方法
// Double::toString // 編譯錯誤:歧義
// 解決:用 Lambda 明確語義
(double d) -> Double.toString(d) // 靜態
(Double d) -> d.toString() // 實例
Map<Character, Long> freq = str.chars()
.mapToObj(cp -> (char) cp)
.collect(Collectors.groupingBy(
c -> c, Collectors.counting()
));
// {w=1, 0=2, t=1}
String.chars() 打通字符串與 Stream 世界,方法引用讓管道操作極簡。掌握四種引用形式與參數路由規則,能將字符級處理代碼壓縮 50% 以上。下一篇將探討 Comparator 函數式重構。