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

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

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

在那里myFunction返回我要地图的字符串。然后,我们创建一个使用Map通过键查找对象的静态方法。

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

我已经将myFunction更新为return List<String>。现在,我希望我的流在列表上进行迭代,将e对象插入Map中,但是我还不太清楚该怎么做。

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

更新:我要做什么似乎有些困惑。我有两个有效的答案(所以我很高兴),但我将添加一个示例,该示例可以帮助正在寻求解决同一问题的任何人。

考虑一个星期几的枚举-该类型中应该恰好有7个对象。我正在尝试从文本描述中编写一种查找方法。TUESDAY对象需要从两个不同的键-tuesday和映射tue。该myFunction方法将在列表中返回这两个键

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


茅侃侃
浏览 135回答 2
2回答

喵喔喔

正如您的标题所述,对单个对象有多个键,我想您想将List中的每个对象映射到相同的enum元素,就像有几种获取它的方法一样它将遍历枚举,对于每个枚举,将使用List<Strings>并创建一些Entry(键/值)并将它们关联以构建地图我为演示添加了一个基本的枚举,其中myFunction以小写和大写形式返回枚举的名称&nbsp;enum AirplaneBrand{&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; AIRBUS(Arrays.asList("A380","A330")),&nbsp; &nbsp; BOEING(Arrays.asList("787","737"));&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; private List<String> values;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; AirplaneBrand(List<String> values){ this.values = values; }&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; public List<String> myFunction(){&nbsp; return values; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; }&nbsp; &nbsp; public static void main(String[] args){&nbsp; &nbsp; &nbsp; &nbsp; final Map<String, AirplaneBrand> MY_MAP =&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Stream.of(AirplaneBrand.values())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .flatMap(en -> en.myFunction().stream().map(elt -> new AbstractMap.SimpleEntry<String,AirplaneBrand>(elt, en)))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(toMap(Entry::getKey, Entry::getValue));&nbsp; &nbsp; &nbsp; &nbsp;System.out.println(MY_MAP);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// {A330=AIRBUS, A380=AIRBUS, 787=BOEING, 737=BOEING}&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(MY_MAP.get("737"));&nbsp; &nbsp; &nbsp;// BOEING&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(MY_MAP.get("A380"));&nbsp; &nbsp; // AIRBUS&nbsp; &nbsp; }}

GCT1015

我建议多加一行private static final Map<String, MyEnumType> MY_MAP;static {&nbsp; &nbsp; Map<String, MyEnumType> local = new HashMap<>();&nbsp; &nbsp; EnumSet.allOf(MyEnumType.class).forEach(e -> e.getValues().forEach(s -> local.put(s, e)));&nbsp; &nbsp; MY_MAP = Collections.unmodifiableMap(local);}哪个结果public enum MyEnumType {&nbsp; &nbsp; RED(List.of("red", "dark red")),&nbsp; &nbsp; BLUE(List.of("blue", "light blue", "dark blue"));&nbsp; &nbsp; private List<String> values;&nbsp; &nbsp; MyEnumType(List<String> values)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; this.values = values;&nbsp; &nbsp; }&nbsp; &nbsp; public List<String> getValues()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return values;&nbsp; &nbsp; }}&nbsp;到映射red -> REDblue -> BLUElight blue -> BLUEdark red -> REDdark blue -> BLUE
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java