创建枚举查找.单个对象的多个键



我一直在使用Joshua Bloch的出色模式来创建从字符串(或其他类型(到枚举对象的查找。创建枚举对象后,我们需要创建一个映射为:

private static final Map<String, MyEnumType> MY_MAP =
Stream.of(values())
.collect(toMap(MyEnumType::myFunction, e -> e));

其中myFunction返回我要映射的字符串。然后,我们创建一个静态方法,该方法使用 Map 按键查找对象。

这很好用,但现在我需要从多个字符串映射每个枚举对象。

我已经更新了myFunction以返回List<String>。现在我希望我的流遍历列表,将e对象插入到 Map 中,但我不太清楚如何。

我认为问题是,如果我创建一个 Stream,我会丢失要插入的e对象。

更新:对于我要求做什么似乎有点困惑。我有两个有效的答案(所以我很高兴(,但我会添加一个示例,它可能会帮助任何希望解决相同问题的人。

考虑一周中几天的枚举 - 该类型中应该恰好包含 7 个对象。我正在尝试从文本描述中编写查找方法。TUESDAY 对象需要从两个不同的键映射 -tuesdaytuemyFunction方法将在列表中返回这两个键

出于查找目的,我需要我的Map<String, Week>有两个指向 TUESDAY 对象的键。

正如您的标题所述多个键到单个对象我想你想将列表中的每个对象映射到同一个枚举元素,就像有几种方法来获取它

它将遍历枚举,对于每个枚举,它将获取List<Strings>并创建一些Entry(键/值(,然后将它们关联起来以构建映射

我为演示添加了一个基本枚举,其中myFunction以小写和大写返回枚举的名称

enum AirplaneBrand{    
AIRBUS(Arrays.asList("A380","A330")),
BOEING(Arrays.asList("787","737"));       
private List<String> values;    
AirplaneBrand(List<String> values){ this.values = values; }    
public List<String> myFunction(){  return values; }        
}
public static void main(String[] args){
final Map<String, AirplaneBrand> MY_MAP =  
Stream.of(AirplaneBrand.values())
.flatMap(en -> en.myFunction().stream().map(elt -> new AbstractMap.SimpleEntry<String,AirplaneBrand>(elt, en)))
.collect(toMap(Entry::getKey, Entry::getValue));
System.out.println(MY_MAP);                 // {A330=AIRBUS, A380=AIRBUS, 787=BOEING, 737=BOEING}
System.out.println(MY_MAP.get("737"));     // BOEING
System.out.println(MY_MAP.get("A380"));    // AIRBUS
}
}

我会重新评论多花一行

private static final Map<String, MyEnumType> MY_MAP;
static {
Map<String, MyEnumType> local = new HashMap<>();
EnumSet.allOf(MyEnumType.class).forEach(e -> e.getValues().forEach(s -> local.put(s, e)));
MY_MAP = Collections.unmodifiableMap(local);
}

哪个结果为

public enum MyEnumType {
RED(List.of("red", "dark red")),
BLUE(List.of("blue", "light blue", "dark blue"));
private List<String> values;
MyEnumType(List<String> values)
{
this.values = values;
}
public List<String> getValues()
{
return values;
}
} 

到映射

red -> RED
blue -> BLUE
light blue -> BLUE
dark red -> RED
dark blue -> BLUE

最新更新