tokenMap.computeIfAbsent是什么方法用来做什么的
时间: 2024-02-09 10:50:05 浏览: 61
tokenMap.computeIfAbsent是一个Map接口中的方法,用于查找指定键对应的值,如果该键不存在,则可以将指定函数应用于该键,并将其返回值存储在Map中,并返回该值。其作用是在Map中根据指定的键查找对应的值,如果键不存在,则可以使用指定函数将其计算出来并存储到Map中,避免了重复计算和重复添加键值对的操作。
相关问题
tokenKey := global.RDb.HGet("key", "token", tokenMap["id"].(string)).Val() tokenKeys := strings.Split(tokenKey, "|") tokenIndex := -1 for k, v := range tokenKeys { if v == token { tokenIndex = k break } }
这是另一个代码片段,它的作用是从 Redis 数据库中读取一个键名为 "key",字段名为 "token",值为 tokenMap["id"].(string) 的哈希表项,并将其值赋给变量 tokenKey。接着,它将 tokenKey 字符串按照 "|" 分隔符进行切割,并赋值给变量 tokenKeys。然后,它遍历 tokenKeys 切片,查找其中是否包含 token 的值。如果找到了,就将其下标赋值给变量 tokenIndex。如果遍历完整个切片都没有找到,那么 tokenIndex 的值将保持为 -1。
这个代码片段的具体用途可能是在一个多设备登录的场景下,判断当前用户的访问令牌是否合法。它从 Redis 数据库中读取了一个哈希表项,该哈希表的键名为 "key",字段名为 "token",值为一个字符串。这个字符串可能包含多个设备的访问令牌,以 "|" 分隔符进行分割。然后,它遍历这些访问令牌,查找是否有与当前访问令牌相同的。如果有,就说明当前用户的访问令牌是有效的。
不改变类,优化以下方法: public TokenType nextToken() { if (!has_end) { if (index < source.length()) { switch (source.charAt(index++)) { case '.': System.out.println("DOT"); return TokenType.DOT; case '(': System.out.println("LPAREN"); return TokenType.LPAREN; case ')': System.out.println("RPAREN"); return TokenType.RPAREN; case '\\': System.out.println("LAMBDA"); return TokenType.LAMBDA; case ' ': return TokenType.BLANK; default: if ('a' <= source.charAt(index - 1) && source.charAt(index - 1) <= 'z') { int temp = index; while (temp < source.length() && (('a' < source.charAt(temp) && source.charAt(temp) <= 'z') || ('A' <= source.charAt(temp) && source.charAt(temp) <= 'Z') || ('0' <= source.charAt(temp) && source.charAt(temp) <= '9'))) { temp++; } index = temp; System.out.println("LCID"); return TokenType.LCID; } else { System.out.println("EOF"); return TokenType.EOF; } } } else { has_end = true; System.out.println("EOF"); return TokenType.EOF; } } System.out.println("EOF"); return TokenType.EOF; }
可以使用一个HashMap来存储字符和它对应的TokenType,以避免在每次调用nextToken()方法时都进行字符匹配。例如:
```
private static final Map<Character, TokenType> tokenMap = new HashMap<Character, TokenType>() {{
put('.', TokenType.DOT);
put('(', TokenType.LPAREN);
put(')', TokenType.RPAREN);
put('\\', TokenType.LAMBDA);
put(' ', TokenType.BLANK);
}};
public TokenType nextToken() {
if (!has_end) {
if (index < source.length()) {
char c = source.charAt(index++);
TokenType tokenType = tokenMap.get(c);
if (tokenType != null) {
System.out.println(tokenType);
return tokenType;
} else if ('a' <= c && c <= 'z') {
int temp = index;
while (temp < source.length() && (('a' < source.charAt(temp) && source.charAt(temp) <= 'z')
|| ('A' <= source.charAt(temp) && source.charAt(temp) <= 'Z')
|| ('0' <= source.charAt(temp) && source.charAt(temp) <= '9'))) {
temp++;
}
index = temp;
System.out.println("LCID");
return TokenType.LCID;
} else {
System.out.println("EOF");
return TokenType.EOF;
}
} else {
has_end = true;
System.out.println("EOF");
return TokenType.EOF;
}
}
System.out.println("EOF");
return TokenType.EOF;
}
```
这样,当需要添加新的字符时,只需要在HashMap中添加对应的键值对即可。在每次调用nextToken()方法时,只需查找HashMap中是否存在对应的TokenType即可。
阅读全文