【问题标题】:Java8: convert one map to another map using streamJava8:使用流将一张地图转换为另一张地图
【发布时间】:2014-09-07 16:49:01
【问题描述】:

我需要将 Java HashMap 转换为 TreeMap 的实例(包括地图内容)

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

我应该用什么代替 ??? 以使此代码可编译?

【问题讨论】:

  • 为什么不只是new TreeMap&lt;&gt;(src)
  • 因为我需要过滤流并删除一些值

标签: java lambda java-8 java-stream


【解决方案1】:

来自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 "实现注意:返回的 Collector 不是并发的。对于并行流管道,combiner 函数通过将一个映射中的键合并到另一个映射中来操作,这可能是一个昂贵的操作。如果是不需要按照遇到的顺序将结果插入 Map,使用 toConcurrentMap(Function, Function) 可以提供更好的并行性能。” docs.oracle.com/javase/8/docs/api/java/util/stream/…
【解决方案2】:

将地图转换为流的另一种方式:

使用 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2011-02-14
    • 1970-01-01
    • 2017-12-25
    • 2010-11-07
    • 1970-01-01
    相关资源
    最近更新 更多