实战小技巧3:字符串与容器互转

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 每天一个实战小技巧:字符串与Collection的互转将字符串转换为List,这种业务场景可以说非常非常常见了,实现方式也比较简单


每天一个实战小技巧:字符串与Collection的互转


将字符串转换为List,这种业务场景可以说非常非常常见了,实现方式也比较简单


public List<String> str2list(String str, String split) {
    String[] cells = str.split(split);
    return Arrays.asList(cells);
}
复制代码


那么除了上面这种实现方式之外,还有其他的么?


I. 字符串转列表



上面的实现姿势相当于字符串先转数组,然后在通过数组转列表,所以可以沿用前一篇字数组转list的几种方式


1. jdk支持方式


借助Collections.addAll来实现


public List<String> str2list2(String str, String split) {
    List<String> list = new ArrayList<>();
    Collections.addAll(list, str.split(split));
    return list;
}
复制代码


上面这种方式适用于输出String的列表,如果我希望转成int列表呢?可以采用下面的方式


public List<Integer> str2intList(String str, String split) {
    return Stream.of(str.split(split))
            .map(String::trim)
            .filter(s -> !s.isEmpty())
            .map(Integer::valueOf).collect(Collectors.toList());
}
复制代码


直接将数组转换为流,然后基于jdk8的特性,来实现转换为int列表


2. guava方式


引入依赖

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.1-jre</version>
</dependency>
复制代码


除了使用jdk原生的方式之外,借助guava也是非常常见的的case了,主要通过Splitter来实现,写法看起来非常秀

public List<String> str2list2(String str, String split) {
    return Splitter.on(split).splitToList(str);
}
复制代码


简单直接的一行代码搞定,如果我们希望是对输出的列表类型进行指定,也可以如下操作

public List<Integer> str2intListV2(String str, String split) {
    return Splitter.on(split).splitToStream(str)
            .map(String::trim).filter(s -> !s.isEmpty())
            .map(Integer::valueOf).collect(Collectors.toList());
}
复制代码


3. apache-commons


引入依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>
复制代码


上面流的方式就很赞了,但是注意它是有jdk版本限制的,虽说现在基本上都是1.8以上的环境进行开发,但也不排除有上古的代码,比如我现在手上的项目,spring还是3...

如果我们不能使用流的方式,那么有什么简单的方式来实现字符串转换为指定类型的列表么?


public List<Integer> str2intListV3(String str, String split) {
    List<Integer> result = new ArrayList<>();
    CollectionUtils.collect(Arrays.asList(str.split(split)), new Transformer<String, Integer>() {
        @Override
        public Integer transform(String s) {
            return Integer.valueOf(s);
        }
    }, result);
    return result;
}
复制代码


上面这个实现也没有多优雅,不过这里有个编程小技巧可以学习,new Transformer(){}的传参方式,这种实现方式有点像回调的写法,虽然他们有本质的区别,此外就是jdk8之后的函数方法,就充分的体现这种设计思路,比如上面的换成jdk8的写法,直接简化为


public List<Integer> str2intListV3(String str, String split) {
    List<Integer> result = new ArrayList<>();
    CollectionUtils.collect(Arrays.asList(str.split(split)), Integer::valueOf, result);
    return result;
}
复制代码


II. 列表转字符串


1. StringBuilder


最容易想到的,直接使用StringBuilder来实现拼接


public String list2str(List<String> list, String split) {
    StringBuilder builder = new StringBuilder();
    for (String str: list) {
        builder.append(str).append(split);
    }
    return builder.substring(0, builder.length() - 1);
}
复制代码


注意两点:


  • 使用StringBuilder而不是StringBuffer (why?)
  • 注意最后一个拼接符号不要


2. String.join


一个更简单的实现方式如下

public String list2str2(List<String> list, String split) {
    return String.join(split, list);
}
复制代码


当然上面这个的缺点就是列表必须是字符串列表,如果换成int列表,则不行


3. gauva


guava也提供了列表转String的方式,同样很简单,而且还没有列表类型的限制


public <T> String list2str3(List<T> list, String split) {
    return Joiner.on(split).join(list);
}
复制代码


III. 小结



本文的考题也非常常见,列表与字符串的互转,这里介绍了多种实现方式,有jdk原生的case(如果没有什么限制,推荐使用它, String.split除外,原因后面再说),如果有更高级的定制场景,如非String类型类表,则可以考虑guava的Splitter/Joinner来实现


在上面的实现中,也提供了几种有意思的编程方式


  • Stream: 流,jdk8之后非常常见了
  • 函数方法,回调写法case



相关文章
|
24天前
|
存储 索引 Python
Python基础 笔记(七) 容器--字符串、列表
Python基础 笔记(七) 容器--字符串、列表
24 4
|
25天前
|
存储 弹性计算 Kubernetes
【阿里云云原生专栏】深入解析阿里云Kubernetes服务ACK:企业级容器编排实战
【5月更文挑战第20天】阿里云ACK是高性能的Kubernetes服务,基于开源Kubernetes并融合VPC、SLB等云资源。它提供强大的集群管理、无缝兼容Kubernetes API、弹性伸缩、安全隔离及监控日志功能。用户可通过控制台或kubectl轻松创建和部署应用,如Nginx。此外,ACK支持自动扩缩容、服务发现、负载均衡和持久化存储。多重安全保障和集成监控使其成为企业云原生环境的理想选择。
188 3
|
30天前
|
存储 缓存 监控
【Docker 专栏】Docker 容器性能调优实战
【5月更文挑战第8天】本文探讨了Docker容器的性能调优技巧,包括理解容器性能指标(如CPU、内存、网络和磁盘I/O)并进行相应调优。重点讲述了CPU和内存的限制设置,网络配置优化以及磁盘I/O性能提升方法。通过实例展示了如何解决高CPU使用率问题,强调了根据应用需求进行调优的重要性,以实现更高效、稳定的容器运行。
【Docker 专栏】Docker 容器性能调优实战
|
30天前
|
前端开发 API 数据库
【Docker专栏】Docker Compose实战:编排多容器应用
【5月更文挑战第7天】Docker Compose是Docker的多容器管理工具,通过YAML文件简化多容器应用部署。它能一键启动、停止服务,保证开发、测试和生产环境的一致性。安装后,创建`docker-compose.yml`文件定义服务,如示例中的web和db服务。使用`docker-compose up -d`启动服务,通过`docker-compose ps`、`stop`、`down`和`logs`命令管理服务。
【Docker专栏】Docker Compose实战:编排多容器应用
|
30天前
|
运维 Linux Docker
Docker详解(十一)——Docker容器CPU资源限额实战Docker详解
Docker详解(十一)——Docker容器CPU资源限额实战
48 5
|
30天前
|
容器
06-数据容器拓展-字符串之间的比较
06-数据容器拓展-字符串之间的比较
|
30天前
|
容器
06-数据容器(序列列表-元组-字符串)的切片操作
06-数据容器(序列列表-元组-字符串)的切片操作
|
30天前
|
索引 容器
06-数据容器str(字符串)-字符串的下标索引/字符串无法修改/查找字符串下标初始值/字符串的替换/字符串的分割/字符串去除前后空格/统计字符串的数量/字符串的循环遍历/对字符串进行分割
06-数据容器str(字符串)-字符串的下标索引/字符串无法修改/查找字符串下标初始值/字符串的替换/字符串的分割/字符串去除前后空格/统计字符串的数量/字符串的循环遍历/对字符串进行分割
|
30天前
|
Java 应用服务中间件 API
【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲
【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲
76 0
|
30天前
|
Cloud Native Shell Linux
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
33 0