【每日鮮蘑】不同人的不同編碼風格

語言: CN / TW / HK

每個人的思路不一樣,寫出的程式碼也不一樣,我在工作中就遇到了一個簡單的例子,與你分享下,你的寫法是哪種呢?歡迎回復!

題目

(不考慮快取方案)根據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("/"));
複製程式碼

總結

同一個專案裡,遇見的這些類似的功能,程式碼大約都是其中某個版本。

  • 你更喜歡哪種編碼?
  • 哪種編碼有潛在危險?
  • 哪種編碼的效能最差?
  • 哪種的效能最好?