java - 我可以在枚举内的值之间映射吗?
问题描述
我创建了具有两个值的枚举:品牌名称和品牌代码。
我想通过输入品牌名称来知道品牌代码。
我也想通过输入品牌代码来知道品牌名称。
这个问题可以用 Enum 解决吗?还是其他代码更有效?我想让代码尽可能短
我创建了以下代码来搜索品牌代码。如果我想反之亦然,我可以创建另一个 Hashmap 和方法来将代码转换为品牌。但这是解决问题的有效方法吗?
public enum Brand{
COLA("cola", "CL8935"),
BREAD("bread", "BR2810"),
SNICKERS("snickers", "SN4423");
private static final Map<String, String> BY_BRAND = new HashMap<>();
static {
for (Brand brand : values()){
BY_BRAND.put(brand.code, brand.brand);
}
}
private final String brand;
private final String code;
public static String convertToCode(String brand){
return BY_BRAND.get(brand.toLowerCase()).toString();
}
}
解决方案
更新 - 添加完整的枚举(带导入)
import java.util.Arrays;
import java.util.function.Function;
enum Brand {
COLA("cola", "CL8935"),
BREAD("bread", "BR2810"),
SNICKERS("snickers", "SN4423");
private final String brand;
private final String code;
Brand(String brand, String code) {
this.brand = brand;
this.code = code;
}
public static Brand findBy(String value, Function<Brand, String> extractor) {
return Arrays.stream(Brand.values())
.filter(brand -> extractor.apply(brand).equalsIgnoreCase(value))
.findFirst()
.orElse("Either a default or throw exception here");
}
public String getBrand() {
return brand;
}
public String getCode() {
return code;
}
}
原来的
您可以使用静态 findBy 方法作为地图的替代方法。这将允许您传入 getter 的值和方法引用,这些引用将用于比较存储在枚举中的值。
这里的区别在于性能(因为映射会更快),您将返回枚举并且您很可能想要默认枚举值或在找不到匹配项时抛出异常。下面是一个例子
public static Brand findBy(String value, Function<Brand, String> extractor) {
return Arrays.stream(Brand.values())
.filter(brand -> extractor.apply(brand).equalsIgnoreCase(value))
.findFirst()
.orElse("Either a default or throw exception here");
}
这可以这样称呼
public static void main(String[] args) {
Brand brand1 = Brand.findBy("cola", Brand::getBrand);
Brand brand2 = Brand.findBy("BR2810", Brand::getCode);
}
推荐阅读
- javascript - 正则表达式用一个或多个字符的多个分隔符进行拆分
- download - Inno Setup 无法从 Google Drive 下载大文件
- python - 如何使用 Pandas 中数据框的两个参数从应用 lambda 的结果中返回列组成数据框
- python - 来自 Altcoin Tradingview RSI 的自己的 RSI 计算潜水员……有人知道为什么吗?
- docker - Docker 桌面中的默认 Docker 注册表
- blazor-server-side - Blazor 应用程序 - 在启动时将查询字符串传递给应用程序
- javascript - 在 div 中加载 JS 函数
- python - Markdown:恢复分隔符中捕获的空格
- java - 如何使用带有 Quarkus 的 Vertx 路由器将所有未找到的路由重定向到 index.html?
- javascript - React:如何在我无法控制的功能组件中使用 refs(即来自库)