java实战小技巧之字符串与容器互转详解
作者:灰灰Blog 发布时间:2023-09-04 10:56:01
目录
前言
I. 字符串转列表
1. jdk支持方式
2. guava方式
3. apache-commons
II. 列表转字符串
1. StringBuilder
2. String.join
3. gauva
III. 小结
总结
前言
每天一个实战小技巧:字符串与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
来源:https://blog.hhui.top/hexblog/2021/08/11/210811-实战小技巧3:字符串与容器互转/


猜你喜欢
- 大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对VIP开放等等,这些权限的控制都可以用
- 此解决方案是针对window的,因为日志默认保存路径在C盘,linux忽略。学习RocketMQ过程中,总是出现com.alibaba.ro
- 博主第一次安装Android Studio 3.6版本的时候就找不到R.java文件,于是在网上找个各种方法,但是都没能解决问题。注意:本博
- 本文实例讲述了C#中Memcached缓存的用法,分享给大家供大家参考。具体方法如下:ICacheStrategy.cs文件如下:publi
- 接着上一篇《javaweb实战之商城项目开发(二)》这一篇主要实现通用的BaseDao.java和使用resultMap映射关联对象一.通用
- 用C++流成员函数put输出单个字符在程序中一般用cout和插入运算符“<<”实现输出,cout流在内存中有相应的缓冲区。有时用
- 一、简介相信大家用eclipse上的模拟器会觉得很慢很卡,这里给大家介绍个好东西安卓模拟器genymotion。了解更多,可到此网站http
- 一、Shader基础知识1.1、什么是Shader在讲什么是Shader之前我们先看看下面两段代码 这两段代码实现的功能都是提取
- Feign简介Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可
- 本文实例为大家分享了Android实现比赛时间闪动效果的具体代码,供大家参考,具体内容如下效果代码上代码public class Twink
- Springmvc调用存储过程,并返回存储过程返还的数据java后端很多时候都需要和数据库进行交互,并返回业务数据。一般情况下都会采用执行S
- 本文实例讲述了java数据结构排序算法之树形选择排序。分享给大家供大家参考,具体如下:这里我们就来说说选择类排序之一的排序:树形选择排序在简
- java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的。静态方法是属于类的,不是属于类的对象。所以可以直接使用类名加
- 1、引出安卓初学者一般在写android Activity的时候总是会在onCreate方法中加上setContentView方法来加载la
- 预览效果图:需要权限:<uses-permission android:name="com.android.launcher
- 本文实例为大家分享了Android读取NFC卡的编号具体代码,供大家参考,具体内容如下NFC相关androidManifest文件设置:一、
- 本文实例为大家分享了Android倒计时效果的具体代码,供大家参考,具体内容如下需求:a.在后台添加时,如果是今日直播,则需要添加开始时间(
- 本文实例为大家分享了java实现时间与字符串之间转换的具体代码,供大家参考,具体内容如下1. long字符串转换成yyyy-MM-dd HH
- 1:Group的功能Group可以管理一组节点Group可以对管理的节点进行增删改查的操作Group可以管理节点的属性1.2:看看JDKSE
- 理解事务之前,先讲一个你日常生活中最常干的事:取钱。比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱