每個人的思路不一樣,寫出的程式碼也不一樣,我在工作中就遇到了一個簡單的例子,與你分享下,你的寫法是哪種呢?歡迎回復!
題目
(不考慮快取方案)根據ids和字典表OilDicVo獲取期望的字串:
name
用/
間隔的字串。
引數
List<String> ids = Lists.newArrayList("A001", "A002", "A004", "A007");
List<OilDicVo> oilDicVos = ...;
複製程式碼
oilDicVos
結構
[
{
"oilsDicId": "A001",
"name": "89#"
},
{
"oilsDicId": "A002",
"name": "92#"
},
{
"oilsDicId": "A003",
"name": "95#"
},
{
"oilsDicId": "A004",
"name": "98#"
},
{
"oilsDicId": "A005",
"name": "87#"
},
{
"oilsDicId": "A006",
"name": "86#"
},
{
"oilsDicId": "A007",
"name": "85#"
},
{
"oilsDicId": "A008",
"name": "84#"
}
]
複製程式碼
期望輸出字串
89#/92#/98#/85#
複製程式碼
版本V1.1
版本V1.1.0
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
StringBuilder stringBuilder = new StringBuilder();
for (String id : ids) {
for (OilDicVo oilDicVo: oilDicVos) {
if (ids.contains(oilDicVo.getOilsDicId())) {
stringBuilder.append("/").append(oilDicVo.getName());
}
}
}
return stringBuilder.toString();
複製程式碼
版本V1.1.1
增加
break
,跳過內層迴圈
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
StringBuilder stringBuilder = new StringBuilder();
for (String id : ids) {
for (OilDicVo oilDicVo: oilDicVos) {
if (ids.contains(oilDicVo.getOilsDicId())) {
stringBuilder.append("/").append(oilDicVo.getName());
break;
}
}
}
return stringBuilder.toString();
複製程式碼
版本V1.2
版本V1.2.0
適用Map代替迴圈.
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
Map<String,String> map = new HashMap<>();
for (OilDicVo oilDicVo: oilDicVos) {
map.put(oilDicVo.getOilsDicId(), oilDicVo.getName());
}
StringBuilder stringBuilder = new StringBuilder();
for (String id : ids) {
stringBuilder.append("/").append(map.get(id));
}
return stringBuilder.toString();
複製程式碼
版本V1.2.1
增加Map的初始大小
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
Map<String,String> map = new HashMap<>(oilDicVos.size());
for (OilDicVo oilDicVo: oilDicVos) {
map.put(oilDicVo.getOilsDicId(), oilDicVo.getName());
}
StringBuilder stringBuilder = new StringBuilder();
for (String id : ids) {
stringBuilder.append("/").append(map.get(id));
}
return stringBuilder.toString();
複製程式碼
版本V1.2.2
減少Map的大小
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
Map<String,String> map = new HashMap<>(ids.size());
for (OilDicVo oilDicVo: oilDicVos) {
if (ids.contains(oilDicVo.getOilsDicId())) {
map.put(oilDicVo.getOilsDicId(), oilDicVo.getName());
}
}
StringBuilder stringBuilder = new StringBuilder();
for (String id : ids) {
stringBuilder.append("/").append(map.get(id));
}
return stringBuilder.toString();
複製程式碼
版本V1.2.3
直接使用Map的Values進行迴圈.
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
Map<String,String> map = new HashMap<>(ids.size());
for (OilDicVo oilDicVo: oilDicVos) {
if (ids.contains(oilDicVo.getOilsDicId())) {
map.put(oilDicVo.getOilsDicId(), oilDicVo.getName());
}
}
StringBuilder stringBuilder = new StringBuilder();
for (String name : map.values()) {
stringBuilder.append("/").append(name);
}
return stringBuilder.toString();
複製程式碼
版本V1.3
使用lambda表示式
版本V1.3.0
使用lambda表示式直接轉換成Map
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
Map<String,String> map = oilDicVos.stream()
.collect(Collectors.toMap(OilDicVo::getOilsDicId, OilDicVo::getName))
StringBuilder stringBuilder = new StringBuilder();
for (String id : ids) {
stringBuilder.append("/").append(map.get(id));
}
return stringBuilder.toString();
複製程式碼
版本V1.3.1
使用lambda表示式篩選可用結果後,轉換成Map
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
Map<String,String> map = oilDicVos.stream()
.filter(oilDicVo -> strings.contains(oilDicVo.getOilsDicId()))
.collect(Collectors.toMap(OilDicVo::getOilsDicId, OilDicVo::getName))
StringBuilder stringBuilder = new StringBuilder();
for (String name : map.values()) {
stringBuilder.append("/").append(name);
}
return stringBuilder.toString();
複製程式碼
版本V1.3.2
使用lambda表示式篩選可用結果後,轉換成Map後,直接對value值進行join處理
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
Map<String,String> map = oilDicVos.stream()
.filter(oilDicVo -> strings.contains(oilDicVo.getOilsDicId()))
.collect(Collectors.toMap(OilDicVo::getOilsDicId, OilDicVo::getName))
return map.values().stream().collect(Collectors.joining("/"));;
複製程式碼
版本V1.3.3
使用lambda一次性進行轉換
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
return oilDicVos.stream()
.filter(oilDicVo -> strings.contains(oilDicVo.getOilsDicId()))
.map(OilDicVo::getName)
.collect(Collectors.joining("/"));
複製程式碼
總結
同一個專案裡,遇見的這些類似的功能,程式碼大約都是其中某個版本。
你更喜歡哪種編碼? 哪種編碼有潛在危險? 哪種編碼的效能最差? 哪種的效能最好?