java實(shí)戰(zhàn)小技巧之字符串與容器互轉(zhuǎn)詳解
前言
每天一個(gè)實(shí)戰(zhàn)小技巧:字符串與Collection的互轉(zhuǎn)
將字符串轉(zhuǎn)換為List,這種業(yè)務(wù)場景可以說非常非常常見了,實(shí)現(xiàn)方式也比較簡單
public List<String> str2list(String str, String split) {
String[] cells = str.split(split);
return Arrays.asList(cells);
}
那么除了上面這種實(shí)現(xiàn)方式之外,還有其他的么?
I. 字符串轉(zhuǎn)列表
上面的實(shí)現(xiàn)姿勢相當(dāng)于字符串先轉(zhuǎn)數(shù)組,然后在通過數(shù)組轉(zhuǎn)列表,所以可以沿用前一篇字?jǐn)?shù)組轉(zhuǎn)list的幾種方式
1. jdk支持方式
借助Collections.addAll來實(shí)現(xiàn)
public List<String> str2list2(String str, String split) {
List<String> list = new ArrayList<>();
Collections.addAll(list, str.split(split));
return list;
}
上面這種方式適用于輸出String的列表,如果我希望轉(zhuǎn)成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());
}
直接將數(shù)組轉(zhuǎn)換為流,然后基于jdk8的特性,來實(shí)現(xiàn)轉(zhuǎn)換為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來實(shí)現(xiàn),寫法看起來非常秀
public List<String> str2list2(String str, String split) {
return Splitter.on(split).splitToList(str);
}
簡單直接的一行代碼搞定,如果我們希望是對輸出的列表類型進(jìn)行指定,也可以如下操作
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版本限制的,雖說現(xiàn)在基本上都是1.8以上的環(huán)境進(jìn)行開發(fā),但也不排除有上古的代碼,比如我現(xiàn)在手上的項(xiàng)目,spring還是3…
如果我們不能使用流的方式,那么有什么簡單的方式來實(shí)現(xiàn)字符串轉(zhuǎn)換為指定類型的列表么?
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;
}
上面這個(gè)實(shí)現(xiàn)也沒有多優(yōu)雅,不過這里有個(gè)編程小技巧可以學(xué)習(xí),new Transformer(){}的傳參方式,這種實(shí)現(xiàn)方式有點(diǎn)像回調(diào)的寫法,雖然他們有本質(zhì)的區(qū)別,此外就是jdk8之后的函數(shù)方法,就充分的體現(xiàn)這種設(shè)計(jì)思路,比如上面的換成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. 列表轉(zhuǎn)字符串
1. StringBuilder
最容易想到的,直接使用StringBuilder來實(shí)現(xiàn)拼接
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);
}
注意兩點(diǎn):
- 使用StringBuilder而不是StringBuffer (why?)
- 注意最后一個(gè)拼接符號不要
2. String.join
一個(gè)更簡單的實(shí)現(xiàn)方式如下
public String list2str2(List<String> list, String split) {
return String.join(split, list);
}
當(dāng)然上面這個(gè)的缺點(diǎn)就是列表必須是字符串列表,如果換成int列表,則不行
3. gauva
guava也提供了列表轉(zhuǎn)String的方式,同樣很簡單,而且還沒有列表類型的限制
public <T> String list2str3(List<T> list, String split) {
return Joiner.on(split).join(list);
}
III. 小結(jié)
本文的考題也非常常見,列表與字符串的互轉(zhuǎn),這里介紹了多種實(shí)現(xiàn)方式,有jdk原生的case(如果沒有什么限制,推薦使用它, String.split除外,原因后面再說),如果有更高級的定制場景,如非String類型類表,則可以考慮guava的Splitter/Joinner來實(shí)現(xiàn)
在上面的實(shí)現(xiàn)中,也提供了幾種有意思的編程方式
- Stream: 流,jdk8之后非常常見了
- 函數(shù)方法,回調(diào)寫法case
總結(jié)
到此這篇關(guān)于java實(shí)戰(zhàn)小技巧之字符串與容器互轉(zhuǎn)的文章就介紹到這了,更多相關(guān)java字符串與容器互轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA配置Maven并版本統(tǒng)一管理的實(shí)現(xiàn)
本文主要介紹了IDEA配置Maven并版本統(tǒng)一管理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
mybatis-plus3.0.1枚舉返回為null解決辦法
這篇文章主要介紹了mybatis-plus3.0.1枚舉返回為null解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Spring中的SpringApplicationRunListener詳細(xì)解析
這篇文章主要介紹了Spring中的SpringApplicationRunListener詳細(xì)解析,SpringApplicationRunListener是一個(gè)監(jiān)聽SpringApplication中run方法的接口,在項(xiàng)目啟動(dòng)過程的各個(gè)階段進(jìn)行事件的發(fā)布,需要的朋友可以參考下2023-11-11
Mybatis如何使用動(dòng)態(tài)語句實(shí)現(xiàn)批量刪除(delete結(jié)合foreach)
這篇文章主要介紹了Mybatis如何使用動(dòng)態(tài)語句實(shí)現(xiàn)批量刪除(delete結(jié)合foreach),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java基礎(chǔ)之詳細(xì)總結(jié)五種常用運(yùn)算符
在通常代碼邏輯處理中,我們常常都會(huì)使用到運(yùn)算符,今天我們就詳細(xì)了解一下運(yùn)算符的使用以及分類.運(yùn)算符是對常量或者變量進(jìn)行操作的符號,它分為算術(shù)運(yùn)算符,賦值運(yùn)算符,比較運(yùn)算符,邏輯運(yùn)算符以及位運(yùn)算符.需要的朋友可以參考下2021-05-05
Java內(nèi)部類應(yīng)用之靜態(tài)內(nèi)部類應(yīng)用示例
這篇文章主要介紹了Java內(nèi)部類應(yīng)用之靜態(tài)內(nèi)部類應(yīng)用,結(jié)合實(shí)例形式分析了Java靜態(tài)內(nèi)部類的原理、功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
SpringBoot連接MYSQL數(shù)據(jù)庫并使用JPA進(jìn)行操作
今天給大家介紹一下如何SpringBoot中連接Mysql數(shù)據(jù)庫,并使用JPA進(jìn)行數(shù)據(jù)庫的相關(guān)操作。2017-04-04

