每天一个实战小技巧:字符串与Collection的互转
将字符串转换为List,这种业务场景可以说非常非常常见了,实现方式也比较简单
1 | public List<String> str2list(String str, String split) { |
那么除了上面这种实现方式之外,还有其他的么?
I. 字符串转列表
上面的实现姿势相当于字符串先转数组,然后在通过数组转列表,所以可以沿用前一篇字数组转list的几种方式
1. jdk支持方式
借助Collections.addAll
来实现
1 | public List<String> str2list2(String str, String split) { |
上面这种方式适用于输出String的列表,如果我希望转成int列表呢?可以采用下面的方式
1 | public List<Integer> str2intList(String str, String split) { |
直接将数组转换为流,然后基于jdk8的特性,来实现转换为int列表
2. guava方式
引入依赖
1 | <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> |
除了使用jdk原生的方式之外,借助guava也是非常常见的的case了,主要通过Splitter来实现,写法看起来非常秀
1 | public List<String> str2list2(String str, String split) { |
简单直接的一行代码搞定,如果我们希望是对输出的列表类型进行指定,也可以如下操作
1 | public List<Integer> str2intListV2(String str, String split) { |
3. apache-commons
引入依赖
1 | <dependency> |
上面流的方式就很赞了,但是注意它是有jdk版本限制的,虽说现在基本上都是1.8以上的环境进行开发,但也不排除有上古的代码,比如我现在手上的项目,spring还是3…
如果我们不能使用流的方式,那么有什么简单的方式来实现字符串转换为指定类型的列表么?
1 | public List<Integer> str2intListV3(String str, String split) { |
上面这个实现也没有多优雅,不过这里有个编程小技巧可以学习,new Transformer(){}
的传参方式,这种实现方式有点像回调的写法,虽然他们有本质的区别,此外就是jdk8之后的函数方法,就充分的体现这种设计思路,比如上面的换成jdk8的写法,直接简化为
1 | public List<Integer> str2intListV3(String str, String split) { |
II. 列表转字符串
1. StringBuilder
最容易想到的,直接使用StringBuilder来实现拼接
1 | public String list2str(List<String> list, String split) { |
注意两点:
- 使用StringBuilder而不是StringBuffer (why?)
- 注意最后一个拼接符号不要
2. String.join
一个更简单的实现方式如下
1 | public String list2str2(List<String> list, String split) { |
当然上面这个的缺点就是列表必须是字符串列表,如果换成int列表,则不行
3. gauva
guava也提供了列表转String的方式,同样很简单,而且还没有列表类型的限制
1 | public <T> String list2str3(List<T> list, String split) { |
III. 小结
本文的考题也非常常见,列表与字符串的互转,这里介绍了多种实现方式,有jdk原生的case(如果没有什么限制,推荐使用它, String.split
除外,原因后面再说),如果有更高级的定制场景,如非String类型类表,则可以考虑guava的Splitter/Joinner来实现
在上面的实现中,也提供了几种有意思的编程方式
- Stream: 流,jdk8之后非常常见了
- 函数方法,回调写法case
系列博文
II. 其他
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog