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()));
}
公共静态映射更改值(
MaptoMap
不支持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)));
}