Java 8:更改条目类型返回 Map

tsc*_*dia 4 java java-8 java-stream

我得到了以下问题:我有一个Map<?,?>,我从一个 PList 文件中解析它,简化为:

Map<String, String> m  = (Map<String, String>) getMap();
Run Code Online (Sandbox Code Playgroud)

getMap()方法只是读取文件(.plist)。我想将所有值解析为 String,但不幸的是 Map 包含整数,导致稍后在此过程中出错。所以我想编写一个使用过滤器将所有内容转换为字符串的方法:

我的做法是:

m.entrySet().stream()
    .map(e -> e.getValue())
    .filter(e -> e instanceof Integer)
    .map(e -> String.valueOf(e))
    .collect(Collectors.toMap(e -> e.keys(), e -> e.getValue()));
Run Code Online (Sandbox Code Playgroud)

问题是,最后的收集不起作用,我该如何解决?结果应该又是一张地图。

非常感谢!

hne*_*atl 7

你误解了Collectors.toMap它的工作原理 - 它需要两个函数,一个给定一个条目产生一个新的键,一个给定一个条目产生一个新值。然后映射中的每个条目都应用了这两个函数,并且该单个元素的结果键/值用于构造新映射中的新条目。

此外,通过将每个条目仅映射到值,您会失去键和值之间的关联,这意味着您无法正确重建映射。

更正后的版本是:

Map<String, String> n;
n = m.entrySet()
     .stream()
     .filter(e -> e.getValue() instanceof Integer)
     .collect(Collectors.toMap(e -> e.getKey(),
                               e -> String.valueOf(e.getValue())));
Run Code Online (Sandbox Code Playgroud)