所以说我有一个TreeMap<MyDataType, Integer>
,其中MyDataType
是一个包含String
和Long
的对象。我想检查TreeMap contains
是否具有某个String
的密钥;但是,与对象关联的Long
对我来说无关紧要。例如,我的TreeMap
可能如下所示:
{MyDataType: ["Tom", 1L] -> 1, MyDataType: ["Billy", 3L] -> 1, MyDataType: ["Ryan", 8L] -> 1}
我想查看TreeMap
是否包含MyDataType
值为“Billy”的密钥(String
类型)。我可以想到两种方法:
(1)逐个迭代TreeMap,检查每个String
键的MyDataType
。
(2)编写一个扩展TreeMap<MyDataType, Integer>
的新类,并编写一个新的containsKeyWithStringValue(String toCheck)
,专门做我想做的事。
还有其他更简洁的方法吗?
答案 0 :(得分:2)
我会创建一个TreeMap<String, Integer>
,将"Tom"
直接映射到2
,"Billy"
到5
等。
答案 1 :(得分:0)
基本上,你问的是否有更强的简洁方式(不是更高效,更具可扩展性,等等)
我认为答案是肯定的。
除了get
之外,标准Java Map API不提供任何查询地图的机制。
Guava库包括对功能样式编程的支持,包括用于过滤键的值,值和Map的条目;见here。但是,当您包含实现Guava谓词所需的所有样板时,怀疑它比手动迭代和测试条目更简洁。
您还要求在“未命中”时抛出异常;即当String / Integer与条目不匹配时。使用该约束,答案肯定是否定的。如果存在“未命中”,则通常将收集API定义为返回null
,因为在Java中创建和抛出异常相对昂贵。
使用Java 8,第一部分的答案可能会改变,因为新的lambda和相关功能将使函数式编程更容易。但这并不能解决您的错误导致异常的要求。
最后,我不喜欢您使用自定义方法扩展TreeMap
的想法。我认为您应该包装类,或者将“扩展功能”实现为静态帮助器方法。这不是客观原因,但在这种情况下,延伸对我来说“感觉正确”。