【问题标题】:Is there a better way to get String[] from an Enum in Java?有没有更好的方法从 Java 中的枚举中获取 String[]?
【发布时间】:2016-10-05 16:23:07
【问题描述】:

我有一个枚举

public enum UnitSystem {
    ImperialSystem("Imperial", "in.", 1),
    MetricSystem("Metric", "cm.", 2.54);
    private String unitSystemName;
    private String lengthSuffix;
    private double lengthCoeff;

我正在尝试获取 String[] l ,该 {"Imperial", "Metric"}; 是一个包含每个系统的 unitSystemName 的数组。现在我最好的选择是:

String[] l = Arrays.stream(UnitSystem.values()).map(UnitSystem::name).collect(Collectors.toList()).toArray(new String[UnitSystem.values().length]);

有没有更好的实现方式?

【问题讨论】:

  • 如果它是关于枚举的字段而不是枚举本身,那么这是一个很好的单线解决方案。如果您经常需要它,您可以随时选择将其存储在一个字段中以便于访问和性能归纳。

标签: java arrays enums


【解决方案1】:

您必须检查枚举值 somewhere 并从中提取名称,无论是像 Calvin 的回答建议的枚举代码内部还是像您所做的那样在它之外。没有办法(至少我想不出办法)来解决这个问题。

不过,您的代码可以稍微清理一下。没有理由将流收集到列表然后将其转换为数组 - 您可以直接将其转换为数组:

String[] l = 
Arrays.stream(UnitSystem.values()).map(UnitSystem::name).toArray(String[]::new);

【讨论】:

    【解决方案2】:
     public enum UnitSystem {
        ImperialSystem("Imperial", "in.", 1),
        MetricSystem("Metric", "cm.", 2.54);
    
        UnitSystem(String unitSystemName, String lengthSuffix, double lengthCoeff) {
            this.UNITE_SYSTEM_NAME = unitSystemName;
            this.LENGTH_SUFFIX = lengthSuffix;
            this.LENGTH_CO_EFF = lengthCoeff;
        }
    
        private final String UNITE_SYSTEM_NAME;
        private final String LENGTH_SUFFIX;
        private final double LENGTH_CO_EFF;
    
        public static String[] getNames() {
            String[] strings = new String[UnitSystem.values().length];
            short count = 0;
            for (UnitSystem s : UnitSystem.values()) {
                strings[count] = s.getName();
                count++;
            }
            return strings;
        }
    
        public String getName() {
            return UNITE_SYSTEM_NAME;
        }
    
        public String getLengthSuffix() {
            return LENGTH_SUFFIX;
        }
    
        public double getLengthCoeff() {
            return LENGTH_CO_EFF;
        }
    }
    

    通过为 UnitSystem 的每个实例使用 getter 方法完成枚举,我们可以创建一个静态方法,该方法返回所有这些枚举名称数据的 String 数组。希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      unitSystemName 声明一个getter 并使用toArray(String[]::new)Stream<String> 转换为String[]

      public enum UnitSystem {
          ...
      
          UnitSystem(String unitSystemName, String lengthSuffix, double lengthCoeff) {
              this.unitSystemName = unitSystemName;
              ...
          }
      
          public String getUnitSystemName() {
              return unitSystemName;
          }
      
          public static String[] getNames() {
              return Arrays.stream(UnitSystem.values())
                      .map(UnitSystem::getUnitSystemName)
                      .toArray(String[]::new);
          }
      }
      

      【讨论】:

        【解决方案4】:

        创建一个名称的静态数组将只允许在类加载器加载类时加载它们一次。如果您有机会多次引用此列表,那将是理想的。

        public enum UnitSystem
        {
          ImperialSystem("Imperial", "in.", 1), MetricSystem("Metric", "cm.", 2.54);
          private String unitSystemName;
        
          private String lengthSuffix;
        
          private double lengthCoeff;
        
          private static String[] names = Arrays.stream(UnitSystem.values())
              .map(UnitSystem::name).toArray(String[]::new);
        
          UnitSystem(String unitSystemName, String lengthSuffix, double lengthCoeff)
          {
            this.unitSystemName = unitSystemName;
            this.lengthSuffix = lengthSuffix;
            this.lengthCoeff = lengthCoeff;
          }
        
          public static String[] getNames()
          {
            return names;
          }
        
          public String getUnitSystemName()
          {
            return unitSystemName;
          }
        
          public String getLengthSuffix()
          {
            return lengthSuffix;
          }
        
          public double getLengthCoeff()
          {
            return lengthCoeff;
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-17
          • 1970-01-01
          • 2011-12-28
          • 2010-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多