侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 285 篇文章
  • 累计创建 125 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

List集合与逗号分割的String字符串互转方法集锦

孔子说JAVA
2022-07-16 / 0 评论 / 0 点赞 / 108 阅读 / 6,847 字 / 正在检测是否收录...

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());
}

image-1657848397160

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);
}

image-1657848628630

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);
}
0

评论区