java - 一次从数据库初始化数据并使用 switch/case 遍历项目
问题描述
我有一个将输入字符串转换为另一个字符串的方法(在数据库中搜索):
public String convert(String input) {
Optional<Item> itemBy = itemRepository.findBySourceValue(input);
if (itemBy.isPresent()) {
return itemBy.get().getConvertedValue();
}
log.error("Invalid item {}", itemBy);
return itemBy;
}
物品实体:
@Entity
@Table(name = "items_conversions", schema = "items")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Item {
private String sourceValue;
private String convertedValue;
}
问题是...我在 Stream 中使用此方法并转换了许多项目(大约 5,000 个),因此它将执行 5000 个与数据库的连接,甚至更多。
典型的 Item 对象包含 2 个字符串,例如:
sourceValue: "ws_id"
convertedValue: "res:id"
首先:我需要一次初始化并从数据库中获取所有值。我想解决方案没问题@PostConstruct
:
private List<Item> items;
@PostConstruct
public void init() {
items = itemsRepository.findAll();
}
但也许我有更好的选择?
第二:
所以我需要编写一些 switch/case 方法来转换值:
switch (input) {
case "ws_id":
return "res:id";
case "ws_amount":
return "res:all";
...
default:
return input;
}
但不适用于硬编码字符串 ->Item
来自数据库对象的值。像这样:
switch (input) {
case items.get(index).getSourceValue:
return items.get(index).getConvertedValue;
...
//and this for all values in list
}
如何解决?
解决方案
将数据放入Map
:
private Map<String, String> itemMap;
@PostConstruct
public void init() {
itemMap = itemsRepository.findAll().stream().collect(Collectors.toMap(Item::getSourceValue, Item::getConvertedValue));
}
public String convert(String input) {
String value = itemMap.get(input);
if (value == null) {
log.error("Invalid input {}", input );
return "";
}
return value;
}
顺便说一句,您的原件convert
没有多大意义。它尝试将一个(始终为空)Optional
作为String
.
推荐阅读
- hash - Swift 4.2 错误:对类使用未实现的初始化程序“init()”
- javascript - 每当从 Electron 记录一些 javascript 错误时,Chrome 开发人员工具都会抛出错误
- api - 通过 API 的 IB(即时彭博)聊天记录
- linux - 如何重命名 bash 中的文件以增加名称中的数量?
- html - 如何预填用户输入表单?
- ruby-on-rails - SSL_connect 返回=1 errno=0 state=error: 证书验证失败(无法获取本地颁发者证书)
- anaconda - 无法启动 Jupyter Notebook:“似乎不是 IPv4 或 IPv6 地址”
- c++ - 如何在 c++ 中将图标放在按钮上?
- javascript - 定义 Javascript 对象时出现不可恢复的语法错误
- android - 找不到android studio 3.2默认活动