Groovy枚举 - 如何返回枚举地图?

时间:2017-10-12 01:05:02

标签: java groovy enums

我有一个groovy枚举,其中包含一个将枚举值作为地图返回的方法,其中包含一些额外的逻辑。

以下是一个例子:

enum MyEnum {
    CAT('feline', 'meow'),
    DOG('canine', 'woof')

    MyEnum(String animalType, String sound){
          this.animalType = animalType
          this.sound = sound
    }

    private final String animalType
    private final String getAnimalType(){
        animalType
    }

    private final String sound
    private final String getSound(){
        sound
    }

    def getMap(List animalsToReturn){
        Map result = [:]

        // do some stuff...
        for (animal in animalsToReturn){
            result.put(MyEnum.animal.animalType, MyEnum.animal.sound)
        }

        return result
    }

}


myMap = MyEnum.getMap(['DOG'])

每当我调用MyEnum.getMap时,我都会收到错误消息,说方法签名不匹配。即使我让getMap在方法中有一个空签名和硬编码值作为测试。有任何想法吗?我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

您需要使用static方法。

static Map getMap(List animalsToReturn) {
    Map result = [:]

    // do some stuff...
    for (animal in animalsToReturn){
        MyEnum myEnum = MyEnum[animal]
        result.put(myEnum.animalType, myEnum.sound)
    }
    result
}

上面应该可行,但是,有一种更简单的方法可以在Groovy中实现相同的结果。

static Map getMap(List animalsToReturn) {   
    animalsToReturn
        .collect { MyEnum.valueOf it }
        .collectEntries { [ it.animalType, it.sound ] }
}

或只是

animalsToReturn.collectEntries {
    MyEnum myEnum = MyEnum[it] 
    [ myEnum.animalType, myEnum.sound ] 
}

答案 1 :(得分:1)

getMap方法应该是静态的。

同样在animalsToReturn列表中使用String。我认为不使用" valueof"会更安全。或MyEnum [' DOG']。

试试这个:

static getMap(List animalsToReturn) {

  MyEnum.values().findAll {
    animalsToReturn.contains(it.toString())
  }.collectEntries {
    [(it.animalType): it.sound]
  }
}