我需要从地图中获取userId
值,并且可以在user1
密钥或user2
密钥或user3
密钥或user4
密钥中显示在地图上。地图中一次只能出现一个密钥,不会出现多个密钥。
所以我开始使用下面的代码来检查user1
是否存在以及是否存在提取user1
键值,否则提取user2
键值。我应该继续添加user3
和user4
检查吗?如果是,它会变得很长......
Map<String, String> holder = Utils.parseStringToMap(payload);
String userId = holder.containsKey("user1") ? holder.get("user1") : holder.get("user2");
根据存在的密钥,有没有更好的方法可以提取userId
值?我使用的是Java 7。
注意:此处该字段的地图中的键名可以是任何名称。它不是userx
,其中x是一个数字,所以我不能在这里使用循环逻辑。
答案 0 :(得分:1)
您可以循环迭代键:
for (int i = 1; i <= 4; i++) {
final String key = "user" + i;
if (holder.containsKey(key)) {
// ... process the found key and value
break;
}
}
这将允许您以后通过更改上限(此示例中为4
)轻松扩展您的键空间。
如果您的名字没有像userX
这样的常见模式,您可以有一个明确的列表:
String[] keys = {"key1", "user2", "somethingelse"};
for (final String key : keys) {
if (holder.containsKey(key)) {
// ... process the found key and value
break;
}
}
答案 1 :(得分:1)
您应该引入一个帮助方法,该方法提供var-args参数来传输任何userId String
以匹配。
它更具可读性和灵活性
例如:
public String getUserId(Map<String, String> valueByUserIds, String... userIdsToMatch){
for (String userIdToMatch : userIdsToMatch){
if (holder.containsKey(userIdToMatch)){
// or spare an invocation by using only holder.get(userIdToMatch) if the value should never be null
return holder.get(userIdToMatch);
}
}
return null; // or throw an exception
}
你可以这样使用它:
Map<String, String> holder = Utils.parseStringToMap(payload);
String userValue = getUserId(holder, "user1");
String userValue = getUserId(holder, "user1", "user2");
String userValue = getUserId(holder, "user1", "user2", "user3");
答案 2 :(得分:0)
我将可能的密钥包装在列表中并迭代它们:
private static String getFromFirstKey
(Map<String, String> map, List<String> keys) {
for (String key : keys) {
if (map.containsKey(key)) {
return map.get(key);
}
}
}
public static void main(String[] args) {
Map<String, String> holder = Utils.parseStringToMap(payload);
String userId =
getFromFirstKey(holder, Arrays.asList("user1", "user2", "user3", "user4"));
}