Java8 Streams-如何将内部映射键的值从;空";一串

Java8 Streams-如何将内部映射键的值从;空";一串,java,java-8,java-stream,collect,nested-map,Java,Java 8,Java Stream,Collect,Nested Map,我有一个实用方法定义如下 public static Map<String, Map<String, String>> convertRawMapToStringValues(Map<String, Map<String, Object>> cassandraRowsRawMap) { Map<String, Map<String, String>> cassandraStrValuesMap = cassandr

我有一个实用方法定义如下

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

toMap
收集器不支持
null
值。但它不一定总是流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()));
}
公共静态映射更改值(

Map
toMap
不支持
null
值。请参阅。@Holger-谢谢。那么,唯一的其他选项是通过嵌套的映射循环并更新值吗?您能为您的方法提供一个示例输入吗?您可以调整收集器。谢谢,@Holger。这两种方法都有效。我喜欢实用方法。它是h帮助我找到一种更好的编写代码的方法,在这种方法中,我不必执行多个嵌套循环,但不必受流限制的影响。
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)));
}