Java8:使用流将一个Map转换为另一个Map

26

我需要将一个 Java HashMap 转换为一个 TreeMap 实例(包括 map 内容)

HashMap<String, Object> src = ...;
TreeMap<String, Object> dest = src.entrySet().stream()
        .filter( ... )
        .collect(Collectors.toMap( ???, ???, ???, TreeMap::new));

我应该用什么替换 ???,才能让这段代码编译通过?


3
为什么不直接使用new TreeMap<>(src) - Alan Stokes
1
因为我需要过滤流并丢弃一些值。 - Anthony
2个回答

44

来自Collectors.toMap(...) javadoc

 * @param keyMapper a mapping function to produce keys
 * @param valueMapper a mapping function to produce values
 * @param mergeFunction a merge function, used to resolve collisions between
 *                      values associated with the same key, as supplied
 *                      to {@link Map#merge(Object, Object, BiFunction)}
 * @param mapSupplier a function which returns a new, empty {@code Map} into
 *                    which the results will be inserted

例如:

HashMap<String, Object> src = ...;
TreeMap<String, Object> dest = src.entrySet().stream()
      .filter( ... )
      .collect(Collectors.toMap(Map.Entry::getKey , Map.Entry::getValue, (a,b) -> a, TreeMap::new));

这个也适用于parallelStream吗?还是我们必须使用ConcurrentSkipList呢? - KIC
@KIC "实现说明: 返回的Collector不是并发的。对于并行流管道,组合器函数通过将一个映射中的键合并到另一个映射中来操作,这可能是一项昂贵的操作。如果不需要按遇到顺序将结果插入Map中,则使用toConcurrentMap(Function,Function)可以提供更好的并行性能。" https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util.function.Function- - NiematojakTomasz

0

将Map转换为流的另一种方法:

使用Stream.of(t)

HashMap<String, Object> src = ...;
TreeMap<String, Object> dest = Stream.of(src)
      .filter( ... )
      .collect(Collectors.toMap(Map.Entry::getKey , Map.Entry::getValue, (a,b) -> a, TreeMap::new));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接