将Java Map代码更改为VAVR(javaslang)

时间:2019-08-23 13:47:45

标签: java spring-boot vavr

我有2种方法涉及纯Java中的Map,我的任务是将其更改为完整的VAVR。现在的问题是我得到了

java.lang.ClassCastException: class java.util.HashMap cannot be cast to class io.vavr.collection.Map (java.util.HashMap is in module java.base of loader 'bootstrap'; io.vavr.collection.Map is in unnamed module of loader 'app')

我认为我知道问题出在哪里,但是作为一个初学者,我无法在完整的VAVR中构建该代码。我知道在stackoverflow上不欢迎此类问题,但是Web上有关VAVR的材料数量有限,我根本找不到任何可以帮助我的示例。我恳请任何帮助-代码段,在哪里找到类似示例的建议或可能对我有帮助的任何内容。我已经阅读了VAVR网页上的手册和许多教程,但是仍然无法建立我的方法。希望你能理解,我对此并不感到骄傲。

public io.vavr.collection.Map<Object, Object> flatten(final Map<Field, Option<Object>> data) {
    final Map<Object, Object> result = new HashMap<>();
    for (final Map.Entry<Field, Option<Object>> entry : data.entrySet()) {
      if (entry.getValue().isDefined()) {
        result.put(flattenKey(entry), flatten(entry.getValue()));
      }
    }
    return (io.vavr.collection.Map<Object, Object>) result;
  }


private Object flattenKey(final Map.Entry<?, ?> entry) {
    if (entry.getKey() == null || StringUtils.isEmpty(String.valueOf(entry.getKey()))) {
      return IndexerHelper.EMPTY_FIELD_NAME;
    } else {
      return flatten(entry.getKey());
    }

  }

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样?仅使用vavr地图

public Map<Object, Object> flatten(Map<Field, Option<Object>> data) {
    return data.filterValues(Option::isDefined)
               .bimap(this::someFlattenOnKey, this::someFlattenOnValue)
}

如果您绝对需要获取Java Map作为输入:

public io.vavr.collection.Map<Object, Object> flatten(Map<Field, Option<Object>> data) {
    return io.vavr.collection.HashMap.ofAll(data)
               .filterValues(Option::isDefined)
               .bimap(this::someFlattenOnKey, this::someFlattenOnValue)
}