2016-03-07 18 views
7

Có một lớp lót để chuyển đổi danh sách Chuỗi thành tập hợp enum không? Ví dụ, có:Chuyển đổi Danh sách <String> thành một Tập hợp bằng Java 8

public enum MyVal { 
    ONE, TWO, THREE 
} 

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

Tôi muốn chuyển đổi myValues đến một Set<MyVal> chứa các mục như:

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

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

Trả lời

20

Có, bạn có thể làm cho một Stream<String> các phần tử của bạn, ánh xạ từng phần tử của chúng đến giá trị enum tương ứng với trình ánh xạ MyVal::valueOf và thu thập một mới EnumSet với toCollection khởi tạo bởi noneOf:

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]" 
} 

Nếu bạn chỉ đơn giản là quan tâm đến việc có một Set như kết quả, không phải là một EnumSet, bạn có thể chỉ cần sử dụng được xây dựng trong thu Collectors.toSet().

+4

Điều đó có được tính là một lớp lót trong những ngày này :-) không? – Thilo

+0

Tùy thuộc vào số ký tự trên mỗi dòng bạn cho phép. SO là keo kiệt trong vấn đề đó. – the8472

+1

Thay vì 'Collectors.toCollection (() -> EnumSet.noneOf (MyVal.class))' Tôi đang làm 'Collectors.toSet()' với cùng một kết quả – otonakav

2

Dưới đây là một-liner hai (nhưng ngắn hơn):

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

Thay vì thêm các yếu tố có mặt trong danh sách, bạn có thể tạo một EnumSet với tất cả các giá trị có thể và loại bỏ những người mà không có mặt trong danh sách .

+1

Thú vị. Nó có thuộc tính hơi khác một chút mà nó không ném một ngoại lệ nếu bất kỳ chuỗi nào không khớp với một enum. Có thể hoặc có thể không được mong muốn, tùy thuộc vào tình hình. – slim

Các vấn đề liên quan