還在手動「淨化」AI 的垃圾輸出?同事用 Java 新方法寫完,已經下班了。

更新 發佈閱讀 18 分鐘

我們使用 AI 服務時,經常遇到一個問題:回傳的文字格式不規範。比如,我們期望得到一個乾淨的 JSON 文字,但實際收到的可能是這樣:

String aiResponse = """

{
"name": "张三",
"message": "Hello\\nWorld"
}

""";

這段文字前後有多餘的空行,內部還有 \n 這樣的轉義字元。直接使用會導致程式出錯。

過去的處理方式

在 Java 11 之前,清理這類文字通常有兩種方式:

  1. 引入第三方函式庫:比如 Apache Commons Lang,增加了專案的複雜度。
  2. 手寫複雜的程式碼:用迴圈和判斷條件,寫很多行程式碼來處理各種情況。

這兩種方式效率都不高,程式碼也不夠簡潔。

現代 Java 的解決方案

現在,Java 自身內建了強大的文字處理方法。我們不再需要外部函式庫或複雜的程式碼。 使用新方法有三個直接的好處:

  1. 零依賴:Java 原生支援,專案更輕量。
  2. 程式碼更少:過去 5 行程式碼的工作,現在 1 行就能完成。
  3. 可讀性好:程式碼像一篇流暢的英文,邏輯清晰。

下面我們介紹 9 個核心的新方法。

核心方法詳解

1. isBlank() - 檢查字串是否為空白

// 傳統方式
String str = " ";
boolean isEmpty = str.trim().isEmpty(); // 繁瑣
// 現代方式
boolean isBlank = str.isBlank(); // 簡潔明瞭

在驗證使用者輸入時,這個方法非常有用。

public boolean isValidUsername(String username) {
return username != null && !username.isBlank();
}

2. lines() – 逐行處理文字

這個方法能把一大段文字,一行行分開進行處理,方便過濾或進行映射(map)操作。

String text = """
第一行
第二行
第三行
""";

text.lines()
.filter(line -> !line.isBlank())
.map(String::trim)
.forEach(System.out::println);

3. repeat(int count) - 重複字串

需要產生一條分隔線,或者增加縮排時,這個方法很方便。

之前:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
sb.append("=");
}
String separator = sb.toString();
  • 現在:
String separator = "=".repeat(10);

一行程式碼就代替了 4 行迴圈,非常清晰。

4. strip() 系列 - 清除空白

strip() 可以清除字串兩端的所有類型的空白字元,包括 Unicode 空白,比舊的 trim() 方法更強大。

String unicode = "\u2000Hello\u2000"; // \u2000 是一个 Unicode 空格

unicode.trim(); // 無法去除
unicode.strip(); // 正確去除

strip(): 清除兩端空白

stripLeading(): 清除開頭空白

stripTrailing(): 清除結尾空白

5. indent(int n) - 調整縮排

為文字的每一行增加或減少指定數量的空格。在格式化程式碼、JSON 或 XML 時很有用。

String code = """
public void hello() {
System.out.println("Hello");
}
""";

// 增加 4 個空格縮排
String indented = code.indent(4);

// 減少 2 個空格縮排
String dedented = code.indent(-2);

6. transform(Function) - 鏈式轉換

這個方法允許我們把一連串的處理操作,用流暢的鏈式方式寫出來,避免了中間變數。

String result = "hello"
.transform(String::toUpperCase)
.transform(s -> s + " WORLD");
// 結果: "HELLO WORLD"

7. formatted(Object... args) - 格式化文字

它是靜態方法 String.format() 的實體版本,不會打斷鏈式呼叫。

之前: String message = String.format("Hello, %s", name);

現在: String message = "Hello, %s".formatted(name);

鏈式呼叫範例:

String report = """
用户: %s
餘額: %.2f
狀態: %s
"""
.formatted(username, balance, status)
.transform(String::strip);

8. stripIndent() - 移除共同的縮排

在處理多行文字區塊時,這個方法可以智慧地移除每一行共有的前置空白。

public String generateSQL() {
return """
SELECT id, name
FROM users
WHERE status = 'active'
""".stripIndent();
}

這樣得到的 SQL 文字就會從第一列開始,沒有多餘的縮排。

9. translateEscapes() - 處理轉義字元

這個方法將文字中的 \n\t 等轉義字元,直接轉換為它們所代表的實際字元。

String escaped = "Hello\\nWorld\\tJava";
String translated = escaped.translateEscapes();

System.out.println(escaped); // Hello\nWorld\tJava
System.out.println(translated); // Hello
// World Java

常見轉義序列:

  • \n - 換行符
  • \t - 定位字元 (Tab)
  • \r - 歸位字元 (Carriage Return)
  • \\ - 反斜線
  • \" - 雙引號
  • \' - 單引號

應用場景:

  • 處理設定檔中的轉義字元
  • 解析使用者輸入的轉義序列
  • 處理 JSON 字串
public String processConfigValue(String value) {
return value
.strip()
.translateEscapes();
}

實戰案例:AI Json Repair

public class PromptBuilder {
/**
* 建構結構化的 AI 提示詞
*/
public String buildPrompt(String role, String task, List<String> examples) {
String exampleSection = examples.stream()
.map("- %s"::formatted)
.collect(Collectors.joining("\n"))
.indent(2);

return """
Role: %s

Task:
%s

Examples:
%s

Please provide your response in JSON format.
""".formatted(role, task.indent(2).strip(), exampleSection)
.stripIndent();
}

/**
* 清理 AI 回傳的結果
*/
public String cleanAIResponse(String aiOutput) {
return aiOutput
.strip() // 去除首尾空白
.lines() // 按行處理
.map(String::strip) // 去除每行空白
.filter(line -> !line.isBlank()) // 過濾空行
.filter(line -> !line.startsWith("```")) // 去除程式碼區塊標記
.collect(Collectors.joining("\n"))
.translateEscapes(); // 處理轉義字元
}

/**
* 提取 AI 回傳的 JSON 內容
*/
public String extractJson(String aiResponse) {
List<String> lines = aiResponse.lines()
.dropWhile(line -> !line.strip().startsWith("{")) // 跳到 JSON 開始
.toList();

// 找到第一個以 } 結尾的行的索引(包含該行)
int endIndex = 0;
for (int i = 0; i < lines.size(); i++) {
if (lines.get(i).strip().endsWith("}")) {
endIndex = i + 1; // +1 是因為 subList 的 toIndex 是不包含自身的
break;
}
}

return String.join("\n", lines.subList(0, endIndex))
.transform(this::cleanAIResponse);
}
}

使用範例:

void main() {
PromptBuilder builder = new PromptBuilder();

// 1. 建構提示詞
String prompt = builder.buildPrompt(
"Java Expert",
"Generate a User entity class with validation",
List.of(
"Include id, name, email fields",
"Add Jakarta validation annotations",
"Use Lombok annotations"
)
);

System.out.println("=== 傳送給 AI 的提示詞 ===");
System.out.println(prompt);

// 2. 模擬 AI 回傳的不規範輸出
String aiResponse = """

Sure! Here's the code:

```java
{
"className": "User",
"fields": "id, name, email"
}
```

Hope this helps!

""";

// 3. 清理 AI 輸出
String cleaned = builder.cleanAIResponse(aiResponse);
System.out.println("\n=== 清理後的結果 ===");
System.out.println(cleaned);

// 4. 提取 JSON
String json = builder.extractJson(aiResponse);
System.out.println("\n=== 提取的 JSON ===");
System.out.println(json);
}

輸出結果:

=== 傳送給 AI 的提示詞 ===
Role: Java Expert

Task:
Generate a User entity class with validation

Examples:
- Include id, name, email fields
- Add Jakarta validation annotations
- Use Lombok annotations

Please provide your response in JSON format.

=== 清理後的結果 ===
Sure! Here's the code:
{
"className": "User",
"fields": "id, name, email"
}
Hope this helps!

=== 提取的 JSON ===
{
"className": "User",
"fields": "id, name, email"
}

組合使用:30 秒清理 AI 回應

回到開頭的例子,我們可以把這些方法組合起來,建構一個高效的清理流程。

public String cleanAIResponse(String aiOutput) {
return aiOutput
.strip() // 1. 清除首尾空白
.translateEscapes() // 2. 將 \n 等轉為實際換行
.lines() // 3. 按行切分
.filter(line -> !line.isBlank()) // 4. 過濾掉完全是空白的行
.collect(Collectors.joining("\n")); // 5. 重新組合成一個字串
}

這個流程不到 30 秒就能寫完,而且能穩定地處理各種不規範的文字輸入。


現在就去試試

這些現代 Java 的 String 方法,讓我們的文字處理程式碼變得更簡潔、更穩定,可讀性也更高。 打開我們的專案,找到一段處理字串的程式碼,看看能否用這些新方法來優化它。快來試試吧!

小弟創建了一個有關ClaudeCode以及寫程式碼的DC群組,目前還處於起步狀態,希望各位能多多支持!每天都會在群組裏分享ClaudeCode的使用技巧。如果大家感興趣,請點按ClaudeCode交流群組加入!感激不盡。

留言
avatar-img
留言分享你的想法!
avatar-img
KoiCode的沙龍
6會員
11內容數
解鎖更多claude code/程式碼相關的玩法和黑科技
KoiCode的沙龍的其他內容
2025/10/06
本篇文章旨在為讀者提供一個關於 Codex AI 程式設計工具的全面指南,涵蓋其使用形態、費用、安裝、權限控制、可用模型、記憶體管理(AGENTS.md)、設定與進階功能,並將其與 Claude Code 進行比較,協助開發者評估是否值得技術遷移。
2025/10/06
本篇文章旨在為讀者提供一個關於 Codex AI 程式設計工具的全面指南,涵蓋其使用形態、費用、安裝、權限控制、可用模型、記憶體管理(AGENTS.md)、設定與進階功能,並將其與 Claude Code 進行比較,協助開發者評估是否值得技術遷移。
2025/09/01
深入探討 Claude Code 的子代理功能,透過圖解方式說明如何建立、配置與使用子代理,提升任務處理效率,並分享實際應用案例與進階技巧,包含自動委託、顯式調用和自訂斜槓命令等。
2025/09/01
深入探討 Claude Code 的子代理功能,透過圖解方式說明如何建立、配置與使用子代理,提升任務處理效率,並分享實際應用案例與進階技巧,包含自動委託、顯式調用和自訂斜槓命令等。
2025/08/21
本文介紹如何結合 Git 版本控制系統與 Claude Code AI 程式設計工具,提升軟體開發效率。內容涵蓋 Git 核心工作流程、分支管理、遠端協作、以及 Claude Code 的整合應用,例如直接執行 Git 指令、GitHub Actions 自動化等進階技巧。
2025/08/21
本文介紹如何結合 Git 版本控制系統與 Claude Code AI 程式設計工具,提升軟體開發效率。內容涵蓋 Git 核心工作流程、分支管理、遠端協作、以及 Claude Code 的整合應用,例如直接執行 Git 指令、GitHub Actions 自動化等進階技巧。
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
透過 No Code 自動化建立「待辦事項 AI 助理」,你只要上傳語音檔在 LINE 聊天室,AI 即自動摘要語音內容,同時新增待辦事項在 Todoist 待辦事項 APP,讓你管理任務更輕鬆!即使臨時接收口頭任務交付,或當下忙著處理別的事情,也能輕鬆建立待辦事項!
Thumbnail
透過 No Code 自動化建立「待辦事項 AI 助理」,你只要上傳語音檔在 LINE 聊天室,AI 即自動摘要語音內容,同時新增待辦事項在 Todoist 待辦事項 APP,讓你管理任務更輕鬆!即使臨時接收口頭任務交付,或當下忙著處理別的事情,也能輕鬆建立待辦事項!
Thumbnail
AI 生產力工具是一款免費、開源的應用程式,適用於 Windows 系統,整合了 ChatGPT 聊天和多個 AI 圖片/影片調整功能。提供完整、輕量兩種版本,差別在於輕量版沒有 ChatGPT 聊天。
Thumbnail
AI 生產力工具是一款免費、開源的應用程式,適用於 Windows 系統,整合了 ChatGPT 聊天和多個 AI 圖片/影片調整功能。提供完整、輕量兩種版本,差別在於輕量版沒有 ChatGPT 聊天。
Thumbnail
網址:https://gadget.chienwen.net/x/text/articlecut 這個網頁裡面有許多小工具, 但感覺現在有很多被 AI 取代掉的東西, 推薦大家可以來用看看~
Thumbnail
網址:https://gadget.chienwen.net/x/text/articlecut 這個網頁裡面有許多小工具, 但感覺現在有很多被 AI 取代掉的東西, 推薦大家可以來用看看~
Thumbnail
這篇文章描述作者如何利用 AI 技術(如 ChatGPT)來輔助撰寫文章的過程。作者詳細拆解了自己的寫作流程,並闡述了每個環節中如何使用 AI 來提高效率。文章強調 AI 在工作流程中所帶來的改變,並指出要適應這種改變需要一定的時間和練習。
Thumbnail
這篇文章描述作者如何利用 AI 技術(如 ChatGPT)來輔助撰寫文章的過程。作者詳細拆解了自己的寫作流程,並闡述了每個環節中如何使用 AI 來提高效率。文章強調 AI 在工作流程中所帶來的改變,並指出要適應這種改變需要一定的時間和練習。
Thumbnail
在當今數字化時代,需求日益增長。本文詳細介紹了幾種常用的PDF轉Word方法,並討論了它們的侷限性。接下來,我們將向您介紹pdftopdf.ai,一款具有先進的OCR和LLM技術,提供高效且保持原始文件格式和質量的解決方案。
Thumbnail
在當今數字化時代,需求日益增長。本文詳細介紹了幾種常用的PDF轉Word方法,並討論了它們的侷限性。接下來,我們將向您介紹pdftopdf.ai,一款具有先進的OCR和LLM技術,提供高效且保持原始文件格式和質量的解決方案。
Thumbnail
這篇文章分享如何透過免費電子郵件課程提供價值,建立信任,並引導訂閱者購買付費產品。透過豐富內容、獨特風格,以及AI的幫助,讓你的需求看起來更具吸引力。
Thumbnail
這篇文章分享如何透過免費電子郵件課程提供價值,建立信任,並引導訂閱者購買付費產品。透過豐富內容、獨特風格,以及AI的幫助,讓你的需求看起來更具吸引力。
Thumbnail
這幾年新出的語言都強打在少寫 code 和提高可讀性,更重要的是能更容易發展出 domain specific language,就這一點 Java 確實有點顯得疲態了。其實文中列的特性大多是一些語法糖衣,但對程式的可讀性和抽象度都能提昇不少,我覺得挺實用也很划算的。
Thumbnail
這幾年新出的語言都強打在少寫 code 和提高可讀性,更重要的是能更容易發展出 domain specific language,就這一點 Java 確實有點顯得疲態了。其實文中列的特性大多是一些語法糖衣,但對程式的可讀性和抽象度都能提昇不少,我覺得挺實用也很划算的。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News