我有一个enum
,其他enum
作为参数
public enum MyEntity{
Entity1(EntityType.type1,
....
MyEntity(EntityType type){
this.entityType = entityType;
}
}
我想创建一个按类型
返回enum
的方法
public MyEntity getEntityTypeInfo(EntityType entityType) {
return lookup.get(entityType);
}
通常我会写
private static final Map<EntityType, EntityTypeInfo> lookup = new HashMap<>();
static {
for (MyEntity d : MyEntity.values()){
lookup.put(d.getEntityType(), d);
}
}
用java流编写它的最佳做法是什么?
答案 0 :(得分:14)
我猜你的代码中有一些拼写错误(我认为该方法应该是静态的,你的构造函数目前正在执行no-op),但是如果我关注你,你可以创建一个来自枚举数组并使用toMap
收集器,将每个枚举与其EntityType
映射为键,并将实例本身映射为值:
private static final Map<EntityType, EntityTypeInfo> lookup =
Arrays.stream(EntityTypeInfo.values())
.collect(Collectors.toMap(EntityTypeInfo::getEntityType, e -> e));
toMap
收藏家不会对返回的地图实现做出任何保证(虽然它目前是HashMap
),但如果您需要更多控制权,可以随时使用overloaded变体,提供投掷合并作为参数。
您也可以使用another trick with a static class,并在构造函数中填充地图。
答案 1 :(得分:3)
public enum FibreSpeed {
a30M( "30Mb Fibre Connection - Broadband Only", 100 ),
a150M( "150Mb Fibre Connection - Broadband Only", 300 ),
a1G( "1Gb Fibre Connection - Broadband Only", 500 ),
b30M( "30Mb Fibre Connection - Broadband & Phone", 700 ),
b150M( "150Mb Fibre Connection - Broadband & Phone", 900 ),
b1G( "1Gb Fibre Connection - Broadband & Phone", 1000 );
public String speed;
public int weight;
FibreSpeed(String speed, int weight) {
this.speed = speed;
this.weight = weight;
}
public static Map<String, Integer> SPEEDS = Stream.of( values() ).collect( Collectors.toMap( k -> k.speed, v -> v.weight ) );
}