首页 > 解决方案 > 我可以在枚举内的值之间映射吗?

问题描述

我创建了具有两个值的枚举:品牌名称和品牌代码。
我想通过输入品牌名称来知道品牌代码。
我也想通过输入品牌代码来知道品牌名称。
这个问题可以用 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();
  } 
}

标签: javaspring-bootjava-8enums

解决方案


更新 - 添加完整的枚举(带导入)

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);
   }

推荐阅读