如何将Map<String, String> 转换为Map<Long, String> ?(选项:使用番石榴)

2022-09-01 12:20:35

我有一个键,只是像“123”等数字值。我得到的是数值,因为这个值来自我的JSF组件中的UI。我不想更改UI组件的合约。

现在我想在上面创建一个,我在类中看到了一些方法,但都集中在转换值而不是键上。

有没有更好的方法可以转换为?Map<String, String>StringMap<Long, String>MaptransformMapsMap<String, String>Map<Long, String>


答案 1

@Vivin的答案是正确的,但我认为解释为什么番石榴没有任何方法可以让你转换一个的钥匙(或者根本改变一个)是有用的。MapSet

番石榴的所有变换和过滤方法都会产生懒惰的结果......函数/谓词仅在使用对象时需要时才应用。他们不创建副本。但是,正因为如此,转换可以很容易地打破 .Set

例如,假设您有一个同时包含“1”和“01”作为键的。它们都是不同的,因此可以合法地将两者都包含为键。但是,如果使用 转换它们,它们都会映射到值 。它们不再是不同的键。如果您创建映射的副本并添加条目,这不会破坏任何内容,因为任何重复的键都将覆盖该键的上一个条目。但是,懒惰的转换将无法强制执行唯一键,因此会破坏 .Map<String, String>StringMapLong.valueOf(String)1MapMap


答案 2

Java 8 的更新

您可以使用流来执行此操作:

Map<Long, String> newMap = oldMap.entrySet().stream()
  .collect(Collectors.toMap(e -> Long.parseLong(e.getKey()), Map.Entry::getValue));

这假定所有键都是 s 的有效字符串表示形式。此外,变换时可能会发生冲突;例如,两者都映射到 .Long"0""00"0L


我认为你必须迭代地图:

Map<Long, String> newMap = new HashMap<Long, String>();
for(Map.Entry<String, String> entry : map.entrySet()) {
   newMap.put(Long.parseLong(entry.getKey()), entry.getValue());
}

此代码假定您已清理 中的所有值(因此没有无效的长整型值)。map

我希望有更好的解决方案。

编辑

我在Commons Collection-Utils中遇到了CollectionUtils#transformedCollection(Collection,Transformer)方法,看起来它可能会做你想做的事情。划痕,它仅适用于实现.Collection


推荐