String、List都是java中非常常用的类,很多工作场景中需要将String转换成List或将List转为String。基于项目的环境(JDK版本,引入的第三方工具包等),有各种不同的转换方式,本文尽量全面的整理了一系列常用的方法,并经过了验证,所有代码都可以拿来直接使用。在文中主要介绍了将逗号分隔字符串转化为集合,以及将集合转化为逗号分隔字符串,当然我们也可以将逗号改为其他分隔符,如果想让方法更通用,我们可以加个分隔符参数。
1、逗号分隔字符串转化为集合
1.1 遍历操作处理
通过遍历操作将字符串添加到List集合中,思路:逗号分隔的字符串–>字符串split方式转数组–>foreach遍历将字符串添加到List集合。此方式代码量大,不够优雅,建议用其他方式。
public void converList1(){
String str ="苹果,荣耀,OPPO";
String[] strArr = str.split(",");
// 遍历操作,代码量大,不优雅
List<String> result = new ArrayList<>();
for(String s: strArr) {
result.add(s);
}
System.out.println(result);
}
1.2 Arrays.asList 方式
使用 Arrays.asList
方式,思路:逗号分隔的字符串–>字符串split方式转数组–>Arrays.asList。
public void converList2(){
String str ="苹果,荣耀,OPPO";
// 逗号分隔的字符串-->数组-->list
List<String> result = Arrays.asList(str.split(","));
System.out.println(result);
}
数组转换List方式:
1)Arrays.asList(strArray)
在此方式中,我们用到了 Arrays.asList(strArray) 方式将数组转换List后,要注意不能List增删,只能查改,否则抛异常。
原因解析:Arrays.asList(strArray)返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,它并非java.util.ArrayList类。java.util.Arrays.ArrayList类具有 set(),get(),contains()等方法,但是不具有添加add()或删除remove()方法,所以调用add()方法会报错。
使用场景:Arrays.asList(strArray)方式仅能用在将数组转换为List后,不需要增删其中的值,仅作为数据源读取使用。
我们还可以用以下方式将数组转换List:
2)ArrayList的构造器
通过ArrayList的构造器,可以将Arrays.asList(strArray)的返回值由java.util.Arrays.ArrayList转为java.util.ArrayList
- 使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量不大的情况下,可以使用。
String[] strArray = new String[2];
ArrayList<String> list = new ArrayList<String>(Arrays.asList(strArray)) ;
3)通过集合工具类Collections.addAll()方法(最高效)
通过Collections.addAll(arrayList, strArray)方式转换,根据数组的长度创建一个长度相同的List,然后通过Collections.addAll()方法,将数组中的元素转为二进制,然后添加到List中,这是最高效的方法。
- 使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量巨大的情况下,优先使用,可以提高操作速度。
String[] strArray = new String[2];
ArrayList< String> arrayList = new ArrayList<String>(strArray.length);
Collections.addAll(arrayList, strArray);
1.3 Java8 Stream实现
如果使用了jdk8及以上的版本,可以通过Java8 Stream实现,推荐用法。
1.3.1 String转List<String>
public void convertList4() {
String str ="苹果,荣耀,OPPO";
List<String> result = Arrays.stream(str.split(",")).collect(Collectors.toList());
System.out.println(result);
}
1.3.2 String转List<Integer>
public void convertIntegerList() {
String ids = "1,2,3,4,5";
List<Integer> idList = Arrays.stream(ids.split(",")).map(Integer::parseInt).collect(Collectors.toList());
System.out.println(idList.toString());
}
1.4 apache StringUtils 工具类
使用 org.apache.commons.lang3.StringUtils
工具类,思路:逗号分隔的字符串–>StringUtils.split方式转数组–>Arrays.asList。
public void converList3(){
String str ="苹果,荣耀,OPPO";
// org.apache.commons.lang3.StringUtils
List<String> result = Arrays.asList(StringUtils.split(str, ","));
System.out.println(result);
}
1.5 org.springframework.util.StringUtils 工具类
public void converList5(){
String str ="苹果,荣耀,OPPO";
List<String> result =Arrays.asList(org.springframework.util.StringUtils.commaDelimitedListToStringArray(str));
System.out.println(result);
}
1.6 Guava的SplitterString 工具类
maven项目需要引入如下依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
转化代码:
// 利用Guava的SplitterString
public void converList6() {
String str ="苹果,荣耀,OPPO";
List<String> result= Splitter.on(",").trimResults().splitToList(str);
System.out.println(result);
}
2、集合转化为逗号分隔字符串
需要转换的集合对象示例:
List<String> list = new ArrayList<>();
list.add("苹果");
list.add("荣耀");
list.add("OPPO");
2.1 遍历操作处理
将集合转换为Iterator对象,再通过遍历操作将字符串合并,思路:集合–>转换为Iterator对象–>foreach遍历将字符串添加StringBuilder–>StringBuilder转String。此方式代码量大,不够优雅,建议用其他方式。
public void converStr1(List<String> list){
// 遍历操作,代码量大,不优雅
StringBuilder strSb = new StringBuilder();
for(Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String str = (String)iterator.next();
strSb.append(str);
if(iterator.hasNext()) {
strSb.append(",");
}
}
String result = strSb.toString();
System.out.println(result);
}
循环的方式很多,如还可以直接循环list。
public void converStr2(List<String> list){
// 遍历操作,代码量大,不优雅
StringBuilder strSb = new StringBuilder();
for(String str: list) {
strSb.append(",");
strSb.append(str);
}
String result = strSb.toString();
if(result.length() > 0) {
result = result.substring(1);
}
System.out.println(result);
}
2.2 StringUtils 工具类
使用 org.apache.commons.lang3.StringUtils
工具类,思路:List集合–>toArray转数组–>StringUtils.join。
public void converStr3(List<String> list){
String result = StringUtils.join(list.toArray(), ",");
System.out.println(result);
}
2.3 使用谷歌的Joiner
maven项目需要引入如下依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
使用谷歌的 com.google.common.base.Joiner
,该方式代码超级短。
public void converStr4(List<String> list){
String result = Joiner.on(",").join(list);
System.out.println(result);
}
2.4 使用StringJoiner,JDK1.8+
StringJoiner是JDK自带的工具包,在1.8以上版本才有。
// StringJoiner, JDK1.8+
public void converStr5(List<String> list){
StringJoiner sj = new StringJoiner(",");
list.forEach(e -> sj.add(String.valueOf(e)));
System.out.println(sj.toString());
// 在连接之前操作字符串, 拼接前缀和后缀
StringJoiner sj2 = new StringJoiner(",", "START_", "_END");
list.forEach(e -> sj2.add(String.valueOf(e)));
System.out.println(sj2.toString());
}
2.5 使用String.join,JDK1.8+
String.join是JDK自带的工具包,在1.8以上版本才有。
public void converStr6(List<String> list) {
String result = String.join(",", list);
System.out.println(result);
}
2.6 使用stream流,JDK1.8+
Stream, Collectors.joining(), JDK1.8+
public void converStr7(List<String> list) {
String result = list.stream().collect(Collectors.joining(","));
System.out.println(result);
// 在连接之前操作字符串, 拼接前缀和后缀
String str = list.stream().map(e -> {
if (e != null) return e.toUpperCase();
else return "null";
}).collect(Collectors.joining(",", "START_", "_END"));
System.out.println(str);
}
2.7 将 List<Integer>
转为逗号分隔字符串
Stream和String.join结合使用,先用Stream将 List<Integer>
转为 List<String>
,再使用String.join方法。
List<Integer>
示例:
List<Integer> integerList = new ArrayList<>();
integerList.add(1);
integerList.add(2);
integerList.add(3);
转换方法1:
// Stream和String.join结合使用
public void converStr8(List<Integer> list) {
List<String> strList = list.stream().map(String::valueOf).collect(Collectors.toList());
String result = String.join(",", strList);
System.out.println(result);
}
转换方法2:
// Stream和String.join结合使用
public void converStr9(List<Integer> list) {
String result = list.stream().map(String::valueOf).collect(Collectors.joining(","));
System.out.println(result);
}
2.8 lambda表达式遍历并加入逗号
public void converStr10(List<Integer> list) {
StringBuilder sb = new StringBuilder();
list.stream().forEach(str->{
sb.append(str).append(",");
});
sb.deleteCharAt(sb.length()-1);
String result = sb.toString();
System.out.println(result);
}
评论区