2015-03-25 1181 views
13

我有一個靜態的枚舉這樣的:Java8 Lambda表達式來遍歷枚舉值和初始化最後成員

private static enum standardAttributes { 
    id, gender, firstname, lastname, mail, mobile 
} 

我需要的所有值作爲字符串。因此,我有這樣的方法:

public static List<String> getStandardRecipientsAttributes() { 
    List<String> standardAttributesList = new ArrayList<String>(); 
    for (standardAttributes s : standardAttributes.values()) 
     standardAttributesList.add(s.toString()); 

    return standardAttributesList; 
} 

每次調用此方法都不需要創建相同的List。所以我創建了一個靜態成員:

static final List<String> standardAttributesList; 
static { 
    standardAttributesList = getStandardRecipientsAttributes(); 
} 

這很好,但我不知道是否有一個花哨的Lambda表達式來替換該方法。事情是這樣的:

Arrays.asList(standardAttributes.values()).forEach((attribute) -> standardAttributesList.add(attribute.toString())); 

兩個問題:

  1. 我能避免Arrays.asList包裝?
  2. 如何處理編譯器錯誤:空白最終字段standardAttributesList可能尚未初始化
+0

只是想知道:在你的枚舉中有一個成員函數是否有意義爲你做到這一點?如果擁有這個枚舉的唯一原因是收集一個可能的枚舉值列表併爲其建立一個字符串表示 - 爲什麼要將第二部分外化? – GhostCat 2015-03-25 09:40:45

+0

好點。我想我把責任歸咎於舊的遺留代碼和遺漏的重構東西:) – 2015-03-25 09:58:17

回答

23

你可以做

static final List<String> standardAttributesList = 
              Stream.of(values()) 
               .map(Enum::name) 
               .collect(Collectors.toList()); 

這將從值的陣列創建視頻,應用.name()方法每一個和最後收集所有的結果轉換成一個列表。

+2

完美!我只想添加toList()方法來自Collectors類。 – 2015-03-25 09:51:19

+0

一篇很好的文章,展示瞭如何迭代Java中的枚舉值:http://www.baeldung.com/java-enum-iteration – OutOfMind 2017-08-09 05:17:07