因此,我有一个映射(字符串,字符串),收到此映射可以包含大约600-800个条目。我的任务是根据键(常量字符串)仅检索这些对中的约60-120(基于某些逻辑)。
现在,我已经创建了所需密钥的列表,正在迭代收到的Map,并将所需的对提取到另一个Map中并传递给它。这行得通,但是代码看起来糟透了。
肯定有一种更好的方法可以做到这一点。有什么建议吗?
我想到了使用contains而不是匹配键,但是我的要求是完全匹配。是的,我读过有关使用RegEx进行精确匹配的信息,因此可以将其用作最后的手段。
我需要什么帮助: 1.比在列表中存储所需密钥更好的方法。该键列表将是一个常数。将60-120个字符串的列表硬编码到列表中看起来很可怕。 2.最快(时间)比较所述列表并提取所需对的方法。
我的代码:
List <String> keysToCheck = new ArrayList<String>();
keysToCheck.add("attrib1");
...
keysToCheck.add("attribN");
Map<String, String> newMap = new HashMap<String, String>();
for (String key : keysToCheck) {
if(mapRcvd.containsKey(key)) {
newMap.put(key, mapRcvd.get(key));
}
}
我正在寻找更快的解决方案,因为这只是大型应用程序的很小一部分。我必须写很多代码才能做到这一点。
答案 0 :(得分:1)
您可以将所有常数键存储在文件中,其中每一行包含一个键。然后,您将获得所有必需的键,例如:
List<String> requiredKeys = Files.lines(Paths.get(PATH_TO_FILE_WITH_KEYS))
.collect(Collectors.toList());
现在使用流filter
方法获取具有必需键的地图:
Map<String, String> collect = mapRcvd.entrySet().stream() // get stream of map entries
.filter(entry -> requiredKeys.contains(entry.getKey())) // filter only such entries which has required key
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); // collect all filtered entries into new map
的更多信息
更新:虽然使用必需的键获取地图可能看起来更紧凑,但示例中的containsKey
方法的for循环比{{1 }}。您可能应该使用评论中剩下的建议@Holger