【问题标题】:How to convert enum with attribute to map using java8 stream如何使用 java8 流将具有属性的枚举转换为映射
【发布时间】:2021-04-07 18:27:43
【问题描述】:

我有一个枚举:

public enum SheetRows{
    totalActive("Total active");

    String value;

    SheetRows(String value){
        this.value = value;
    }

    public String getValueForTable() {
        return value;
    }
}

如何将此枚举转换为HashMap<SheetRows, String>

我尝试使用:

HashMap<SheetRows, String> cellsMap = Arrays.asList(SheetRows.values()).stream()
            .collect(Collectors.toMap(k -> k, v -> v.getValueForTable()));

但是这段代码没有被编译。

【问题讨论】:

  • 这是因为toMap 被写入返回Map,而不是HashMap。就这些吗?

标签: java java-stream


【解决方案1】:

以下应该可以工作,问题是您正在尝试将Map 分配给HashMap

Map<SheetRows, String> map = EnumSet.allOf(SheetRows.class)
        .stream()
        .collect(Collectors.toMap(Function.identity(), SheetRows::getValueForTable));

System.out.println("map = " + map); // map = {totalActive=Total active}

如果你真的需要返回一个HashMap,你也可以使用像下面这样接受一个供应商和一个mergeFunction的重载。

mergeFunction 永远不会被调用,因为您的枚举是唯一的,所以只需选择一个随机的。

HashMap<SheetRows, String> map = EnumSet.allOf(SheetRows.class)
        .stream()
        .collect(Collectors.toMap(Function.identity(), SheetRows::getValueForTable, (o1, o2) -> o1, HashMap::new));

System.out.println("map = " + map); // map = {totalActive=Total active}

【讨论】:

  • 我认为@Yassin Hajaj 默认情况下 toMap 方法会生成一个 HashMap,在我的 Java 版本 1.8 中它调用 toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new) 在这种情况下它可能是使用 (HashMap) 投射?
  • 是的,确实可以@SergeyAfinogenov,但不能保证将来JDK会继续发送HashMap,这是一个实现细节,唯一重要的是合同/规格
  • @SergeyAfinogenov 见this question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多