为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2021-04-16 18:15:24
我一直在使用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对象的键。
查看完整描述

2 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

正如您的标题所述,对单个对象有多个键,我想您想将List中的每个对象映射到相同的enum元素,就像有几种获取它的方法一样


它将遍历枚举,对于每个枚举,将使用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

    }

}


查看完整回答
反对 回复 2021-04-28
?
GCT1015

TA贡献1827条经验 获得超4个赞

我建议多加一行


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


查看完整回答
反对 回复 2021-04-28
  • 2 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信