1、代码
java 代码
import com.google.common.base.Splitter;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StringConvertsList {
public static final Logger log = LoggerFactory.getLogger(StringConvertsList.class);
public static void main(String[] args) {
String str = "张 三, 李四 ,王五,赵六,张 三";
// 1: split()和Arrays.asList()
List<String> list1 = splitAndTrim(str);
printList(list1, 1);
// 2: 使用Stream API
List<String> list2 = usingStream(str);
printList(list2, 2);
// 3: 使用Guava库的Splitter类
List<String> list3 = usingGuava(str);
printList(list3, 3);
// 4: 使用Apache Commons库的StringUtils类
List<String> list4 = usingStringUtils(str);
printList(list4, 4);
}
/**
* 1:split()和Arrays.asList()
* <p>
* Arrays.asList(strArr)返回的是java.util.Arrays.ArrayList,而不是常用的java.util.ArrayList。
* java.util.Arrays.ArrayList是数组的内部类,它不支持添加或删除元素的操作,但可以修改现有元素。
* 当调用Arrays.asList(strArr)时,它会将数组转换为一个固定大小的列表。这个列表是一个视图,与原始数组共享同一块内存。
* 因此,对列表的修改实际上是对原始数组进行的修改。
*
* <p>
* 性能:这种方法在性能上比较高效,因为它直接使用了Java标准库提供的split()方法和Arrays.asList()方法。
* <p>
* 使用场景:适用于简单的字符串分割和去除空格操作,且对性能要求较高的情况。
*/
private static List<String> splitAndTrim(String str) {
String[] strArr = str.split(",");
List<String> list = Arrays.asList(strArr);
removeSpaces(list);
return list;
}
/**
* 2:使用Stream API:
* <p>
* str.split(",") 返回一个字符串数组,然后使用.of() 方法将该数组转换为一个 Stream 对象。
* .of() 是 Stream 接口中的一个静态方法。它接受一个参数,将该参数(一个数组或一组元素)转换为一个 Stream 对象。
*
* <p>
* 性能:Stream API在处理大量数据时可能会影响性能,因为它需要创建和操作流对象。
* <p>
* 使用场景:适用于对集合进行复杂操作和转换,且代码可读性较高的情况。
*/
private static List<String> usingStream(String str) {
List<String> list = Stream
.of(str.split(","))
.map(String::trim)
.collect(Collectors.toList());
removeSpaces(list);
return list;
}
/**
* 3:使用Guava库的Splitter类:
* <p>
* 直接使用Splitter方法返回的是一个不可修改的List,
* 重新 new 一个 arrayList 修改 list 去除字符串中间的空格
*
* <p>
* 性能:Guava的Splitter类提供了更多的功能和灵活性,但相对于其他方法,性能稍差。
* <p>
* 使用场景:适用于需要更精细的字符串处理和拆分规则的情况,例如可以指定多个分隔符、保留空字符串等。
*/
private static List<String> usingGuava(String str) {
List<String> list = new ArrayList<>(Splitter
.on(",")// 1. 指定分隔符为逗号
.trimResults() // 2. 去除每个分隔后的字符串的前后空格
.omitEmptyStrings() // 3. 去除结果列表中的空字符串
.splitToList(str)); // 4. 将字符串按照分隔符拆分为列表
removeSpaces(list);
return list;
}
/**
* 4:使用Apache Commons库的StringUtils类:
*
* <p>
* 性能:和第一种方法类似,性能较高,但不如Stream API那么灵活。
* <p>
* 使用场景:适用于简单的字符串分割和去除空格操作,且习惯使用Apache Commons库的情况。
*/
private static List<String> usingStringUtils(String str) {
String[] strArr = StringUtils.split(str, ",");
List<String> list = Arrays.asList(strArr);
removeSpaces(list);
return list;
}
/**
* 去除空格
*/
public static void removeSpaces(List<String> list) {
// 去除前后的空格
list.replaceAll(String::trim);
// 去除列表中每个元素中间的空格
list.replaceAll(s -> s.replaceAll(" ", ""));
}
/**
* 输出
*/
public static void printList(List<String> list, Integer method) {
// JDK 14 引入了新的 Switch 表达式语法,允许使用箭头符号(->)
switch (method) {
case 1 -> log.debug("1:split()和Arrays.asList():");
case 2 -> log.debug("2:Stream API");
case 3 -> log.debug("3:Guava库的Splitter");
case 4 -> log.debug("4:Apache Commons库的StringUtils");
}
// 需要去重使用distinct()
list.stream().distinct().forEach(log::info);
System.out.println();
}
}
pom 代码
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.0.0-jre</version>
</dependency>
<!--日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.18.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.8</version>
</dependency>
</dependencies>
2、性能及场景
每种方法的性能和使用场景如下:
-
split()和Arrays.asList()
-
性能:这种方法在性能上比较高效,因为它直接使用了Java标准库提供的split()方法和Arrays.asList()方法。
-
使用场景:适用于简单的字符串分割和去除空格操作,且对性能要求较高的情况。
-
-
使用Stream API:
- 性能:Stream API在处理大量数据时可能会影响性能,因为它需要创建和操作流对象。
- 使用场景:适用于对集合进行复杂操作和转换,且代码可读性较高的情况。
-
使用Guava库的Splitter类:文章来源:https://www.toymoban.com/news/detail-756554.html
- 性能:Guava的Splitter类提供了更多的功能和灵活性,但相对于其他方法,性能稍差。
- 使用场景:适用于需要更精细的字符串处理和拆分规则的情况,例如可以指定多个分隔符、保留空字符串等。
-
使用Apache Commons库的StringUtils类:文章来源地址https://www.toymoban.com/news/detail-756554.html
- 和第一种方法类似,性能较高,但不如Stream API那么灵活。
- 适用于简单的字符串分割和去除空格操作,且习惯使用Apache Commons库的情况
3、总结
- 如果对性能要求较高,且只需要简单的字符串分割和去除空格操作,推荐使用split()和Arrays.asList()方法。
- 如果对集合操作较复杂或代码可读性较重要,使用Stream API可以方便实现链式操作。
- 如果需要更多的字符串处理功能或更灵活的拆分规则,可以选择Guava库的Splitter类。
- 如果习惯使用Apache Commons库,可以选择StringUtils类。
到了这里,关于Java String 转换 List的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!