2016-10-05 5 views
2

У меня есть перечислениеЕсть ли лучший способ получить String [] из Enum в Java?

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

Есть ли лучший способ его реализовать?

+1

Если его поля Enum вместо самого Enum, то это хорошее решение oneliner. Если вам это нужно на регулярной основе, вы всегда можете сохранить его в поле для упрощения доступа и производительности. – n247s

ответ

0
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, мы можем создать статический метод, который возвращает массив строк всех этих имен перечислений данных. Надеюсь это поможет!

1

Вам нужно будет перечислить значения перечисления где-нибудь и извлечь из них имена, будь то внутри кода перечисления, как предлагает предложение Кальвина или вне его, как вы это делали. Нет никакого способа (по крайней мере, я не могу придумать), чтобы обойти это.

Однако код может быть очищен чуть-чуть. нет никаких причин, чтобы собрать поток в списке, а затем преобразовать его в массив - вы можете преобразовать его в массив непосредственно:

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

Объявить поглотитель для unitSystemName и использовать 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); 
    } 
} 
0

Создание статического массива имен позволит им загружать только один раз, когда загрузчик классов загружает класс. Если есть вероятность, что вы будете ссылаться на этот список более одного раза, это будет идеально.

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