所以,我有一个Map(字符串,字符串),我收到这个地图可以有大约600-800个条目。我的任务是根据键(常量字符串)仅检索这些对的约60-120(基于某些逻辑)。
现在我已经创建了一个所需键的列表,我正在迭代我收到的地图,并将所需的对拉出到另一个地图并传递给它。这有效,但代码看起来很糟糕。
肯定有一个更好的方法来做到这一点。有什么建议?
我想到使用包而不是匹配键,但我的要求是完全匹配。是的,我读到了使用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));
}
}
我正在寻找更快的解决方案,因为这将是更大应用程序的一小部分。我很高兴不得不编写大量代码来实现这一目标。
您可以将所有常量键存储在文件中,其中每行包含一个键。然后你可以获得所有必需的键,如:
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
关于Collectors.toMap
,javadoc的更多信息
更新:虽然使用所需键获取地图可能看起来更紧凑,但在您的示例中使用containsKey
方法的for循环比contains
更快。您应该在评论中使用@Holger中的建议