杰瑞科技汇

Java List如何高效转String?

在 Java 中,将 List 转换为 String 是一个非常常见的操作,主要有以下几种方法,适用于不同的场景。

Java List如何高效转String?-图1
(图片来源网络,侵删)

哪种方法最好?

方法 适用场景 优点 缺点
String.join() 强烈推荐,适用于 List<String> 或任何可以轻松转为字符串的元素集合。 代码最简洁、可读性最高、性能好。 仅适用于 List<String> 或其他 CharSequence 的集合。
Stream 非常灵活,适用于任何类型的 List,可以在拼接前对元素进行处理。 功能强大,可以链式调用,支持并行处理。 代码稍长,对于简单拼接来说有点“杀鸡用牛刀”。
手动循环 适用于 Java 8 之前的老版本,或者需要高度自定义拼接逻辑时。 灵活性最高,逻辑完全可控。 代码冗长,容易出错(如忘记处理最后一个分隔符)。
StringUtils.join() 如果你已经在使用 Apache Commons Lang 或 Spring Framework。 功能强大,支持各种类型的集合。 需要引入第三方库。

使用 String.join() (最推荐,仅限 List<String>)

如果你的 List 中存放的就是 String 对象,这是最简单、最直接的方法。

语法: String.join(CharSequence delimiter, List<String> list)

  • delimiter: 分隔符,用于在元素之间插入。
  • list: 要连接的 List<String>

示例代码:

import java.util.Arrays;
import java.util.List;
public class ListToStringExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        // 使用逗号和空格作为分隔符
        String result = String.join(", ", names);
        System.out.println(result);
        // 输出: Alice, Bob, Charlie
        // 使用 " | " 作为分隔符
        String resultWithPipe = String.join(" | ", names);
        System.out.println(resultWithPipe);
        // 输出: Alice | Bob | Charlie
        // 使用空字符串作为分隔符(直接拼接)
        String resultWithNoDelimiter = String.join("", names);
        System.out.println(resultWithNoDelimiter);
        // 输出: AliceBobCharlie
    }
}

使用 Java 8 Stream API (最灵活)

这是现代 Java 中最通用、最强大的方法,它可以处理任何类型的 List,并且可以在拼接前对元素进行转换(调用 toString() 或其他方法)。

Java List如何高效转String?-图2
(图片来源网络,侵删)

核心思想:

  1. List 转换为 Stream (list.stream())。
  2. 使用 map() 将流中的每个元素(非 String 类型)转换为它的字符串表示形式。
  3. 使用 Collectors.joining() 来收集流中的元素并拼接成一个字符串。

示例代码:

场景 1: List<String> (与方法一效果相同)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamToStringExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        String result = names.stream()
                             .collect(Collectors.joining(", "));
        System.out.println(result);
        // 输出: Alice, Bob, Charlie
    }
}

场景 2: List<Integer> 或其他非 String 类型

这是 Stream 方法最强大的地方,我们可以轻松地将 Integer 转换为 String

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamToStringExample2 {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 10, 25);
        String result = numbers.stream()
                               // map(Object::toString) 等同于 .map(num -> num.toString())
                               .map(Object::toString) 
                               .collect(Collectors.joining(" - "));
        System.out.println(result);
        // 输出: 1 - 2 - 3 - 10 - 25
    }
}

场景 3: 拼接自定义对象列表

假设你有一个 Person 类,你想拼接 Person 对象的 name 属性。

Java List如何高效转String?-图3
(图片来源网络,侵删)
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}
public class StreamToStringExample3 {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("Alice", 30),
            new Person("Bob", 25),
            new Person("Charlie", 35)
        );
        // 拼接对象的 toString() 结果
        String result1 = people.stream()
                               .map(Object::toString)
                               .collect(Collectors.joining(" | "));
        System.out.println(result1);
        // 输出: Person{name='Alice', age=30} | Person{name='Bob', age=25} | Person{name='Charlie', age=35}
        // 拼接对象的 name 属性
        String result2 = people.stream()
                               .map(Person::getName) // 方法引用,获取每个Person的name
                               .collect(Collectors.joining(", "));
        System.out.println(result2);
        // 输出: Alice, Bob, Charlie
    }
}

使用传统的 for 循环 (适用于旧版 Java)

在 Java 8 之前,这是唯一的方法,虽然代码较长,但逻辑清晰,适用于任何 Java 版本。

核心思想:

  1. 创建一个 StringBuilder 对象(比直接使用 拼接字符串性能更好)。
  2. 遍历 List 中的每一个元素。
  3. 将元素添加到 StringBuilder 中,并在元素后添加分隔符。
  4. 循环结束后,移除末尾多余的分隔符。
  5. StringBuilder 转换为 String

示例代码:

import java.util.Arrays;
import java.util.List;
public class LoopToStringExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        StringBuilder sb = new StringBuilder();
        String delimiter = ", ";
        for (String name : names) {
            sb.append(name);
            sb.append(delimiter);
        }
        // 移除最后一个分隔符
        if (sb.length() > 0) {
            sb.setLength(sb.length() - delimiter.length());
        }
        String result = sb.toString();
        System.out.println(result);
        // 输出: Alice, Bob, Charlie
    }
}

使用 Apache Commons Lang 的 StringUtils.join()

如果你的项目已经依赖了 Apache Commons Lang 或 Spring Framework,可以使用 StringUtils 工具类。

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;
public class ApacheStringUtilsExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        String result = StringUtils.join(names, ", ");
        System.out.println(result);
        // 输出: Alice, Bob, Charlie
        List<Integer> numbers = Arrays.asList(1, 2, 3);
        // StringUtils.join 可以处理数组和集合,内部会自动调用 toString()
        String numberResult = StringUtils.join(numbers, " - ");
        System.out.println(numberResult);
        // 输出: 1 - 2 - 3
    }
}
  • ListList<String>,优先使用 String.join(),它最简洁、高效。
  • List 是其他类型,或者需要复杂的转换逻辑,使用 Stream API,它功能强大且是现代 Java 的标准做法。
  • 如果项目不允许使用 Java 8+ 或第三方库,使用 for 循环和 StringBuilder
  • 如果项目已经引入了 Apache Commons/SpringStringUtils.join() 是一个方便的选择。
分享:
扫描分享到社交APP
上一篇
下一篇