Java 创建枚举查找。单个对象的多个关键点

Java 创建枚举查找。单个对象的多个关键点,java,enums,java-stream,Java,Enums,Java Stream,我一直在使用Joshua Bloch的优秀模式创建从字符串(或其他类型)到枚举对象的查找。创建枚举对象后,我们需要创建一个映射,如下所示: private static final Map<String, MyEnumType> MY_MAP = Stream.of(values()) .collect(toMap(MyEnumType::myFunction, e -> e)); 私有静态最终映射我的映射= 流(值()) .collect(toM

我一直在使用Joshua Bloch的优秀模式创建从字符串(或其他类型)到枚举对象的查找。创建枚举对象后,我们需要创建一个映射,如下所示:

private static final Map<String, MyEnumType> MY_MAP =
    Stream.of(values())
          .collect(toMap(MyEnumType::myFunction, e -> e));
私有静态最终映射我的映射=
流(值())
.collect(toMap(MyEnumType::myFunction,e->e));
其中
myFunction
返回要映射的字符串。然后,我们创建一个静态方法,该方法使用映射按键查找对象

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

我已更新myFunction以返回
列表
。现在我想让我的流在列表上迭代,将
e
对象插入到地图中,但我不太清楚如何操作

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

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

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


为了便于查找,我需要我的
地图
有两个键指向星期二对象。

我建议多画一行

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);
}
由于您的标题为单个对象声明了多个键,我假设您希望将列表中的每个对象映射到同一个enum元素,就像有几种方法可以获得它一样

它将遍历枚举,对于每个枚举,它将获取
列表
,并创建一些
条目
(一个键/值),并将它们关联起来以构建映射

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

enum AirplaneBrand{
空中客车(Arrays.asList(“A380”、“A330”)),
波音公司(Arrays.asList(“787”、“737”));
私有列表值;
AirplaneBrand(列表值){this.values=values;}
公共列表myFunction(){返回值;}
}
公共静态void main(字符串[]args){
最终地图我的地图=
Stream.of(AirplaneBrand.values())
.flatMap(en->en.myFunction().stream().map(elt->new AbstractMap.SimpleEntry(elt,en)))
.collect(toMap(条目::getKey,条目::getValue));
System.out.println(MY_MAP);/{A330=空客,A380=空客,787=波音,737=波音}
System.out.println(MY_MAP.get(“737”);//波音
System.out.println(MY_MAP.get(“A380”);//空客
}
}

如果返回列表,地图的类型是什么?还是要用哪根弦?或者像列表中的所有元素一样,必须将znum作为值,您确定不想保留它吗
Map
,这个枚举可能是
Color
,你会有一个
Map
像:
[“red”,“red”]=Color.red
,你会想搜索不再是地图查找的“red”,顺便说一句,为什么不保持地图的原样,简单地将不同的键映射到同一个值呢?像
red==Color.red
red==Color.red
?@Eugene你的第二个命题就是我所理解的,得到列表并将所有值映射为key,枚举为keyvalue@azro可能这个还不清楚,,我们需要看看什么
MyEnumType::myFunction
你从我这里得到了一个加号,因为我飞了所有这些:)谢谢你的建议-我更喜欢你的解决方案的简单性,但我接受了另一个答案,因为如果两个枚举使用同一个键,它将失败。(很遗憾我不能接受两个答案)对不起
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
 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
    }
}