在日常開發中,集合與字符串的相互轉換是高頻操作。無論是將 List 拼接為逗號分隔的字符串存入數據庫,還是解析前端傳來的 CSV 格式參數,掌握高效、優雅的轉換方式都能顯著提升代碼質量。本文將介紹 Apache Commons Lang 的 StringUtils.join 與 JDK 原生 String.split + Arrays.asList 兩種主流方案。
引入 Maven 依賴:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
核心代碼:
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.List;
List<String> sports = Arrays.asList("籃球", "足球");
String joined = StringUtils.join(sports, ",");
System.out.println(joined); // 輸出:籃球,足球
優勢:
無需第三方庫,JDK 內置即可完成:
String str = "籃球,足球,排球";
// 1. 正則分割得到數組(注意轉義特殊字符)
String[] arr = str.split(",");
// 2. 數組轉 List(注意:返回的 List 為固定長度,不可增刪)
List<String> list = Arrays.asList(arr);
// 3. 若需可變 List,再包一層
List<String> mutableList = new ArrayList<>(list);
mutableList.forEach(System.out::println);
/* 輸出:
籃球
足球
排球
*/
避坑指南:
Arrays.asList 返回的列表不支持 add/remove,操作會拋出 UnsupportedOperationException,需 `new ArrayList<>(list)` 包裝。str.split("\\|")。List<String> data = Arrays.asList("A", "", "B", null, "C");
// StringUtils.join 會保留空字符串,需先過濾
List<String> filtered = data.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
String result = StringUtils.join(filtered, ";"); // A;B;C
class User { String name; int age; /* getter/setter */ }
List<User> users = List.of(new User("張三", 20), new User("李四", 25));
// Java 8 Stream 方案
String names = users.stream().map(User::getName).collect(Collectors.joining(","));
// 輸出:張三,李四
| 場景 | 推薦方案 | 備註 |
|---|---|---|
| 集合 → 字符串 | StringUtils.join(list, ",") | 引入 commons-lang3,最簡潔高效 |
| 字符串 → 集合 | Arrays.asList(str.split(",")) + new ArrayList() | 純 JDK,注意不可變列表問題 |
| 對象屬性拼接 | Stream.map().collect(joining()) | Java 8+,函數式風格,無第三方依賴 |
| 高性能批量拼接 | StringBuilder 手動循環 | 極端性能敏感場景,避免對象創建開銷 |
選擇原則:優先用標準庫/成熟工具類表達業務意圖,性能瓶頸時再優化。Apache Commons Lang 經過廣泛生產驗證,是處理字符串操作的首選利器。