Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将带有属性的枚举转换为映射_Java_Enums_Java Stream - Fatal编程技术网

在Java中将带有属性的枚举转换为映射

在Java中将带有属性的枚举转换为映射,java,enums,java-stream,Java,Enums,Java Stream,我的枚举如下: @AllArgsConstructor public enum EnumExample { VAL1("val1 description", 100), VAL2("val2 description", 200); String description; int value; } [ { "name": "VAL1", "descrip

我的枚举如下:

@AllArgsConstructor
public enum EnumExample {
    VAL1("val1 description", 100),
    VAL2("val2 description", 200);

    String description;
    int value;
}
[
  {
    "name": "VAL1",
    "description": "val1 description",
    "value": 100
  },
  {
    "name": "VAL2",
    "description": "val2 description",
    "value": 200
  }
]
现在,我想返回所有带有属性的枚举值,作为映射列表,如下所示:

@AllArgsConstructor
public enum EnumExample {
    VAL1("val1 description", 100),
    VAL2("val2 description", 200);

    String description;
    int value;
}
[
  {
    "name": "VAL1",
    "description": "val1 description",
    "value": 100
  },
  {
    "name": "VAL2",
    "description": "val2 description",
    "value": 200
  }
]
我可以使用以下代码实现这一点:

Arrays.stream(EnumExample.values())
      .map(enumExample -> 
              ImmutableMap.of("name", enumExample.name(),
                              "description", enumExample.description,
                              "value", enumExample.value))
      .collect(Collectors.toList())
但我想知道是否有任何最好的方法可以实现同样的效果,而无需显式地将EnumExample转换为Map。如果添加了任何新属性,那么它应该作为新的
K,V
对出现在结果映射中

我尝试了以下方法,但都只返回枚举值
[VAL1,VAL2]

  • com.google.common.collect.Lists.newArrayList(EnumExample.values())
  • Arrays.stream(EnumExample.values()).collect(Collectors.toList())
也尝试转换为映射,但返回
{“VAL2”:“VAL2”,“VAL1”:“VAL1”}

任何不需要手动创建地图的线索或更好的方法都值得赞赏

我的要求:


在Web服务中,将所有枚举值以及属性返回给客户端。客户端具有解析所有属性的逻辑。就像今天有一个description属性,明天如果有新属性,比如
boolean-manadatoryField
,那么它只需要由客户端处理。但是在服务器端,如果不手动创建每个枚举的映射并返回映射,我就无法返回带有属性的枚举值。

回答我自己的问题以帮助他人。如果这是唯一的办法,那就投票吧

Arrays.stream(EnumExample.values())
      .map(enumExample -> 
              ImmutableMap.of("name", enumExample.name(),
                              "description", enumExample.description,
                              "value", enumExample.value))
      .collect(Collectors.toList())

任何在不显式地将EnumExample转换为Map的情况下实现相同功能的最佳方法都是非常值得赞赏的。例如,如果添加了任何新属性,那么它应该作为新的
K,V
对出现在结果映射中。

找到了一种使用
Jackson
的简单方法:

向枚举添加注释

@Getter
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
name

public String getName() {
    return this.name();
}
new ObjectMapper().writeValueAsString(EnumExample.values())
返回可转换为Map的有效JSON。在我的情况下,我返回,这对客户