Java Groovy枚举-如何返回枚举的映射?

Java Groovy枚举-如何返回枚举的映射?,java,groovy,enums,Java,Groovy,Enums,我有一个groovy枚举,它包含一个方法,以映射的形式返回枚举的值,其中包含一些额外的逻辑 以下是一个例子: enum MyEnum { CAT('feline', 'meow'), DOG('canine', 'woof') MyEnum(String animalType, String sound){ this.animalType = animalType this.sound = sound } pri

我有一个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在方法中有一个空签名和硬代码值作为测试。有什么想法吗?我做错了什么?

您需要使用
静态方法

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 ] 
}

您需要使用
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 ] 
}

getMap方法应该是静态的

同样,当您在animalsToReturn列表中使用字符串时。我认为不使用“valueof”或MyEnum['DOG']会更安全

试试这个:

static getMap(List animalsToReturn) {

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

getMap方法应该是静态的

同样,当您在animalsToReturn列表中使用字符串时。我认为不使用“valueof”或MyEnum['DOG']会更安全

试试这个:

static getMap(List animalsToReturn) {

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

谢谢-我不知道为什么我总是忘记groovy是基于java构建的!谢谢-我不知道为什么我总是忘记groovy是基于java构建的!