我刚刚开始研究Java 8,为了尝试Java 8,我想我应该尝试重写我最近写的一个非常简单的东西。我需要将一个String到Column的Map转换成另一个String到Column的Map,其中新Map中的Column是第一个Map中的Column的防御副本。列具有复制构造函数。目前为止最接近的是
Map<String, Column> newColumnMap= new HashMap<>();
originalColumnMap.entrySet().stream().forEach(x -> newColumnMap.put(x.getKey(), new Column(x.getValue())));
但我相信一定有更好的方法,我会很感激你的建议。
8条答案
按热度按时间blpfk2vs1#
你可以使用Collector:
wqnecbli2#
你可以使用
forEach
方法来做你想做的事情。你在做的是:
我们可以将其简化为lambda:
因为我们只是调用一个现有的方法,所以我们可以使用method reference,这给了我们:
5cnsuln73#
保持简单,使用Java 8:
xwbd5t1u4#
不将所有条目重新插入到新Map中的方法应该是最快的,但它不会,因为
HashMap.clone
也在内部执行反汇编。v1l68za45#
如果在项目中使用Guava(最低v11),则可以使用Maps::transformValues。
注意:这个Map的值是延迟计算的。如果转换的代价很高,你可以将结果复制到一个新的Map上,就像Guava文档中建议的那样。
当返回的map不需要是视图时,为了避免延迟计算,请将返回的map复制到您选择的新map中。
voj3qocg6#
这里有另一种方法,可以让你同时访问键和值,以防你必须做某种转换。
4uqofj5v7#
如果你不介意使用第三方库,我的cyclops-react库有所有JDK集合类型的扩展,包括Map。您可以直接使用map或bimap方法来转换Map。一个MapX可以从一个现有的Map构建,例如。
如果您还希望更改密钥,则可以编写
bimap可用于同时转换键和值。
当MapX扩展Map时,生成的map也可以定义为
5jdjgkvh8#
从Java 9开始,在流的
map
部分进行转换变得更加容易。已经可以使用new AbstractMap.SimpleImmutableEntry
了,但是Map接口有一个额外的静态方法Map.entry
,它也可以创建一个条目,用于这种情况。Java 9+