0

我有一个定义如下的实用程序方法。

public static Map<String, Map<String, String>> convertRawMapToStringValues(Map<String, Map<String, Object>> cassandraRowsRawMap) {

    Map<String, Map<String, String>> cassandraStrValuesMap = cassandraRowsRawMap.entrySet()
       .stream()
       .collect(Collectors.toMap(s -> s.getKey(),
          s -> s.getValue().entrySet().stream()
             .collect(Collectors.toMap(e -> e.getKey(), 
                                            e -> String.valueOf(e.getValue())))));
    return cassandraStrValuesMap;
}

从调用中String.valueOf(e.getValue())返回一个“null”值。我想获取null字符串的值。

当我尝试下面的代码时,我在第一次.collect调用时收到了 NPE。

Map<String, Map<String, String>> cassandraStrValuesMap = cassandraRowsRawMap.entrySet()
   .stream()
   .collect(Collectors.toMap(s -> s.getKey(),
                             s -> s.getValue().entrySet().stream()
                      .collect(Collectors.toMap(e -> e.getKey(), 
                                                e -> e.getValue() == null ? null : String.valueOf(e.getValue())))));
    return cassandraStrValuesMap;
}
4

1 回答 1

1

收集toMap器不支持null值。但它并不总是必须是 Stream API:

public static <K,T,R> Map<K,R> changeValues(
       Map<? extends K, T> in, Function<? super T, ? extends R> f) {

    Map<K,R> result = new HashMap<>(in.size());
    in.forEach((k,t) -> result.put(k, f.apply(t)));
    return result;
}

public static Map<String, Map<String, String>> convertRawMapToStringValues(
       Map<String, Map<String, Object>> in) {

    return changeValues(in, inner -> changeValues(inner, v -> v==null? null: v.toString()));
}

该实用程序方法返回具有相同键和转换值的映射,并且足够灵活以允许递归应用程序执行内部映射转换。


或者,我们可以将此答案的解决方案调整为

public static Map<String, Map<String, String>> convertRawMapToStringValues(
       Map<String, Map<String, Object>> in) {

    return in.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey,
            e -> e.getValue().entrySet().stream()
            .collect(
                HashMap::new,
                (m,e2) -> m.put(e2.getKey(),
                    e2.getValue() == null? null: e2.getValue().toString()),
                Map::putAll)));
}

与原始toMap收集器不同,这不会抛出重复的键,但对于输入已经是 a 的这种特定情况,Map无论如何都不应该有重复的键。

于 2019-07-22T15:34:44.030 回答