還在手動「淨化」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
KoiCode的沙龍
13會員
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
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
透過 No Code 自動化建立「待辦事項 AI 助理」,你只要上傳語音檔在 LINE 聊天室,AI 即自動摘要語音內容,同時新增待辦事項在 Todoist 待辦事項 APP,讓你管理任務更輕鬆!即使臨時接收口頭任務交付,或當下忙著處理別的事情,也能輕鬆建立待辦事項!
Thumbnail
透過 No Code 自動化建立「待辦事項 AI 助理」,你只要上傳語音檔在 LINE 聊天室,AI 即自動摘要語音內容,同時新增待辦事項在 Todoist 待辦事項 APP,讓你管理任務更輕鬆!即使臨時接收口頭任務交付,或當下忙著處理別的事情,也能輕鬆建立待辦事項!
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
AI 生產力工具是一款免費、開源的應用程式,適用於 Windows 系統,整合了 ChatGPT 聊天和多個 AI 圖片/影片調整功能。提供完整、輕量兩種版本,差別在於輕量版沒有 ChatGPT 聊天。
Thumbnail
AI 生產力工具是一款免費、開源的應用程式,適用於 Windows 系統,整合了 ChatGPT 聊天和多個 AI 圖片/影片調整功能。提供完整、輕量兩種版本,差別在於輕量版沒有 ChatGPT 聊天。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
在當今數字化時代,需求日益增長。本文詳細介紹了幾種常用的PDF轉Word方法,並討論了它們的侷限性。接下來,我們將向您介紹pdftopdf.ai,一款具有先進的OCR和LLM技術,提供高效且保持原始文件格式和質量的解決方案。
Thumbnail
在當今數字化時代,需求日益增長。本文詳細介紹了幾種常用的PDF轉Word方法,並討論了它們的侷限性。接下來,我們將向您介紹pdftopdf.ai,一款具有先進的OCR和LLM技術,提供高效且保持原始文件格式和質量的解決方案。
Thumbnail
這幾年新出的語言都強打在少寫 code 和提高可讀性,更重要的是能更容易發展出 domain specific language,就這一點 Java 確實有點顯得疲態了。其實文中列的特性大多是一些語法糖衣,但對程式的可讀性和抽象度都能提昇不少,我覺得挺實用也很划算的。
Thumbnail
這幾年新出的語言都強打在少寫 code 和提高可讀性,更重要的是能更容易發展出 domain specific language,就這一點 Java 確實有點顯得疲態了。其實文中列的特性大多是一些語法糖衣,但對程式的可讀性和抽象度都能提昇不少,我覺得挺實用也很划算的。
Thumbnail
這篇文章分享如何透過免費電子郵件課程提供價值,建立信任,並引導訂閱者購買付費產品。透過豐富內容、獨特風格,以及AI的幫助,讓你的需求看起來更具吸引力。
Thumbnail
這篇文章分享如何透過免費電子郵件課程提供價值,建立信任,並引導訂閱者購買付費產品。透過豐富內容、獨特風格,以及AI的幫助,讓你的需求看起來更具吸引力。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
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
這篇要搭建一個同時生成寫實照片跟動漫風格圖片的工作流,還可以幫線稿上色。
Thumbnail
這篇要搭建一個同時生成寫實照片跟動漫風格圖片的工作流,還可以幫線稿上色。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News