2016-03-07 2 views
7

Gibt es einen Einzeiler, um eine Liste von String in eine Reihe von Enum zu konvertieren? Zum Beispiel mit:Konvertieren Sie eine Liste <String> in ein Set mit Java 8

public enum MyVal { 
    ONE, TWO, THREE 
} 

und

List<String> myValues = Arrays.asList("ONE", "TWO", "TWO"); 

Ich mag würde myValues zu einem Set<MyVal> enthält die gleichen Elemente wie konvertieren:

EnumSet.of(MyVal.ONE, MyVal.TWO) 
+0

http://stackoverflow.com/a/26731123/3641067 –

Antwort

20

Ja, Sie können eine machen Stream<String> Ihrer Elemente, ordnen Sie jede von ihnen mit dem Mapper MyVal::valueOf dem jeweiligen Enum-Wert zu und sammeln Sie das in ein neues EnumSet mit toCollection von noneOf initialisiert:

public static void main(String[] args) { 
    List<String> myValues = Arrays.asList("ONE", "TWO", "TWO"); 
    EnumSet<MyVal> set = 
     myValues.stream() 
       .map(MyVal::valueOf) 
       .collect(Collectors.toCollection(() -> EnumSet.noneOf(MyVal.class))); 
    System.out.println(set); // prints "[ONE, TWO]" 
} 

Wenn Sie einfach nur daran interessiert sind, ein Set als Ergebnis, nicht eine EnumSet in haben, können Sie einfach die Collectors.toSet() Einbau-Kollektor verwenden.

+4

Zählt das heute als One-Liner :-)? – Thilo

+0

Hängt von der Anzahl der Zeichen pro Zeile ab, die Sie zulassen. SO ist in dieser Hinsicht geizig. – the8472

+1

Statt 'Collectors.toCollection (() -> EnumSet.noneOf (MyVal.class))' Ich mache 'Collectors.toSet()' mit dem gleichen Ergebnis – otonakav

2

Hier ist ein Zweizeiler (aber kürzer):

EnumSet<MyVal> myVals = EnumSet.allOf(MyVal.class); 
myVals.removeIf(myVal -> !myValues.contains(myVal.name())); 

statt, die auf der Liste Elemente hinzufügen, könnten Sie eine EnumSet mit allen möglichen Werten erstellen und diejenigen entfernen, die auf der Liste nicht vorhanden sind .

+1

Interessant. Es hat die etwas andere Eigenschaft, dass es keine Ausnahme auslöst, wenn einer der Strings nicht mit einer Aufzählung übereinstimmt. Vielleicht oder vielleicht nicht wünschenswert, je nach Situation. – slim

Verwandte Themen