我遇到了一些正在做这样的事情的代码:
Map<String,String> fullNameById = buildMap1(dataSource1);
Map<String,String> nameById = buildMap2(dataSource2);
Map<String,String> nameByFullName = new HashMap<String,String>();
Map<String,String> idByName = new HashMap<String,String>();
Set<String> ids = fullNameById.keySet();
for (String nextId : ids) {
String name = nameById.get(nextId);
String fullName = fullNameById.get(nextId);
nameByFullName.put(fullName, name);
idByName.put(name, nextId);
}
我不得不盯着它看了几分钟才能弄清楚发生了什么。所有这些都相当于对 id 的连接操作和原始地图之一的反转。由于 Id、FullName 和 Name 始终是 1:1:1,在我看来应该有一些方法来简化这一点。我还发现前两张地图再也没有使用过,而且我发现上面的代码有点难以阅读。所以我正在考虑用这样的东西代替它(对我来说)读起来更干净
Table<String, String, String> relations = HashBasedTable.create();
addRelationships1(dataSource1, relations);
addRelationships2(dataSource2, relations);
Map<String,String> idByName = relations.column("hasId");
Map<String,String> nameByFullName = relations.column("hasName");
relations = null; // not used hereafter
在 addRelationships1 我做
relations.put(id, "hasFullName", fullname);
在我的查询产生值的 addRelationships2 中id
,name
我做到了
relations.put(relations.remove(id,"hasFullName"), "hasName", name);
relations.put(name, "hasId", id);
所以我的问题是:
- 我通过处理器或内存或 GC 负载所做的工作是否存在潜在的低效率?我不这么认为,但我对 Table 的效率不是很熟悉。我知道 Table 对象在之后不会被 GC
relations = null
,我只是想说明它不会在随后的相当长的代码部分中再次使用。 - 我有没有提高效率?我不断地说服自己和不说服自己,我有也没有。
- 你觉得这更具可读性吗?或者这只是因为我写的而对我来说很容易阅读?我在这方面有点担心,因为事实
Table
并不为人所知。另一方面,顶层现在很清楚地说,“从两个来源收集数据并从中制作这两张地图。” 我也喜欢这样一个事实,即它不会让您想知道其他两张地图是否/在哪里使用(或不使用)。 - 你有比上述任何一种方法更好、更清洁、更快、更简单的方法吗?
请不要在这里进行优化早期/晚期讨论。我很清楚这个陷阱。如果它在不损害性能的情况下提高了可读性,我很满意。性能提升将是一个不错的奖励。
注意:我的变量和方法名称已在这里进行了清理,以防止业务领域分散讨论,我绝对不会将它们命名为 addRelationships1 或 datasource1!同样,最终的代码当然会使用常量而不是原始字符串。