簡體   English   中英

有沒有更好的方法從 Java 中的 Enum 獲取 String[]?

[英]Is there a better way to get String[] from an Enum in 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]);

有沒有更好的方法來實現它?

您必須在某處查看枚舉值並從中提取名稱,無論是在枚舉代碼內部(如 Calvin 的答案所建議的那樣)還是在外部代碼(如您所做的那樣)。 沒有辦法(至少我想不出)解決這個問題。

不過,您的代碼可以稍微清理一下。 沒有理由將流收集到列表然后將其轉換為數組 - 您可以直接將其轉換為數組:

String[] l = 
Arrays.stream(UnitSystem.values()).map(UnitSystem::name).toArray(String[]::new);
 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 數組。 希望這可以幫助!

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

制作一個靜態名稱數組將只允許它們在類加載器加載類時加載一次。 如果您有機會多次引用此列表,那將是理想的選擇。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM