2015-06-29 18 views
6

Tôi có một enum với enum khác như một tham sốLàm thế nào để lưu trữ enum để lập bản đồ sử dụng Java 8 dòng API

public enum MyEntity{ 
    Entity1(EntityType.type1, 
    .... 


    MyEntity(EntityType type){ 
    this.entityType = entityType; 
    } 
} 

Tôi muốn tạo ra một phương pháp mà trả lại enum theo loại

public MyEntity getEntityTypeInfo(EntityType entityType) { 
     return lookup.get(entityType); 
    } 

thường tôi đã viết

private static final Map<EntityType, EntityTypeInfo> lookup = new HashMap<>(); 

static { 
    for (MyEntity d : MyEntity.values()){ 
     lookup.put(d.getEntityType(), d); 
    } 
} 

Thế nào là thực hành tốt nhất để viết nó bằng luồng java?

+1

Enum của bạn có được gọi là 'EntityTypeInfo' hoặc' MyEntity' không? – Eran

Trả lời

13

Tôi đoán có một số lỗi chính tả trong mã của bạn (phương pháp nên tĩnh theo ý kiến ​​của tôi, nhà xây dựng của bạn đang thực hiện lệnh cấm), nhưng nếu tôi theo dõi bạn, bạn có thể tạo luồng từ mảng enums và sử dụng các nhà sưu tập toMap, lập bản đồ mỗi enum với EntityType của nó cho các phím, và lập bản đồ các trường hợp chính nó như là một giá trị:

private static final Map<EntityType, EntityTypeInfo> lookup = 
    Arrays.stream(EntityTypeInfo.values()) 
      .collect(Collectors.toMap(EntityTypeInfo::getEntityType, e -> e)); 

các nhà sưu tập toMap không thực hiện bất kỳ sự bảo đảm về việc thực hiện bản đồ trở lại (mặc dù hiện tại là HashMap), nhưng bạn luôn có thể sử dụng biến thể overloaded nếu bạn cần kiểm soát nhiều hơn, cung cấp sự hợp nhất ném ngang một mét.

Bạn cũng có thể sử dụng another trick with a static class và điền vào bản đồ trong hàm tạo.

+2

Bạn có thể cải thiện điều này bằng 'Function.identity()' thay vì 'e -> e' như' Function.identity() 'luôn trả về cùng một hàm. –

+1

@ dustin.schultz 'e -> e' giống hệt nhau, vì biểu thức lambda này không nắm bắt các giá trị, nó sẽ là một singleton được sử dụng lại ở mỗi lời gọi. Hơn nữa, 'Function.identity()' được thực hiện như 'return t -> t;'. –

+1

Ah có, không chụp, do đó, sử dụng singleton. Tôi vẫn nghĩ rằng Function.identity() là rất rõ ràng hơn một chút. :) –

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