Мышление у всех разное, и код пишут разный.Наткнулся на простой пример на работе.Поделюсь с вами,какой у вас метод написания? Ответы приветствуются!
тема
(Игнорируя схему кэширования) Получить ожидаемую строку на основе идентификаторов и таблицы словаря 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
Используйте карту вместо цикла.
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
Увеличьте начальный размер карты
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
Уменьшить размер карты
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
Цикл напрямую с использованием значений карты.
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
Используйте лямбда-выражения
Версия V1.3.0
Преобразование непосредственно в карту с использованием лямбда-выражения
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
После фильтрации доступных результатов с помощью лямбда-выражения преобразуйте их в карту
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
После использования лямбда-выражения для фильтрации доступных результатов после преобразования в карту напрямую присоединяйтесь к значению значения.
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
Однократное преобразование с использованием лямбда
List<String> ids = ...;
List<OilDicVo> oilDicVos = ...;
return oilDicVos.stream()
.filter(oilDicVo -> strings.contains(oilDicVo.getOilsDicId()))
.map(OilDicVo::getName)
.collect(Collectors.joining("/"));
Суммировать
В этом же проекте встречающийся код этих похожих функций, вероятно, является одной из версий. Какой ты предпочитаешь? У кого хуже производительность? Что более производительно?