首页 > 解决方案 > 一次从数据库初始化数据并使用 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
}

如何解决?

标签: javaspring

解决方案


将数据放入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.


推荐阅读