【发布时间】:2017-11-09 17:24:54
【问题描述】:
这里是 Java 8。我有一个方法checkDupeKeys,它将三个不同的SortedMap 实例作为其参数,并且需要验证没有两个SortedMap 实例具有相同的键。迄今为止我最好的尝试:
private void checkDupeKeys(SortedMap<String, Fizz> fizzes, SortedMap<String, Buzz> buzzes,
SortedMap<String, Foobar> foobars) {}
List<String> keyNames = new ArrayList<>();
keyNames.addAll(fizzes.keySet().stream().collect(Collectors.toList()));
keyNames.addAll(buzzes.keySet().stream().collect(Collectors.toList()));
keyNames.addAll(foobars.keySet().stream().collect(Collectors.toList()));
if(keyNames.size() > keyNames.stream().collect(Collectors.toSet()).size()) {
throw new IllegalArgumentException("Duplicate key names are not allowed.");
}
}
我相信这是可行的,但是很可能有更好的方法(效率等)。
我主要担心的是这种方法不允许我识别哪些键名是重复的。理想情况下,我希望异常消息是:
Duplicate key names are not allowed. You have the following duplicate key names: (1) fizzes["derp"] and buzzes["derp"]. (2) fizzes["flim"] and foobars["flim"]. (3) buzzes["flam"] and foobars["flam"].
如何修改我的(非静态)checkDupeKeys 方法以引发符合此条件的异常?也就是说,我如何访问流中的哪些键是彼此重复的。我确信我可以使用较旧的 Java 集合 API 以困难的方式做到这一点,但在这个解决方案中,效率和利用 Java 8 API 对我来说很重要。
【问题讨论】:
-
为什么stackoverflow.com/questions/27677256/… 不适合你,为什么在添加键本身时不抛出异常?介意分享一下您尝试过的使用旧 Java 集合的艰难方法吗?
标签: java collections java-8 java-stream