Java 版
import java.util.*;
public final class ThreadLocalUtil {
private static final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal() {
protected Map<String, Object> initialValue() {
return new HashMap(4);
}
};
public static Map<String, Object> getThreadLocal(){
return threadLocal.get();
}
public static <T> T get(String key) {
Map map = (Map)threadLocal.get();
return (T)map.get(key);
}
public static <T> T get(String key,T defaultValue) {
Map map = (Map)threadLocal.get();
return (T)map.get(key) == null ? defaultValue : (T)map.get(key);
}
public static void set(String key, Object value) {
Map map = (Map)threadLocal.get();
map.put(key, value);
}
public static void set(Map<String, Object> keyValueMap) {
Map map = (Map)threadLocal.get();
map.putAll(keyValueMap);
}
public static void remove() {
threadLocal.remove();
}
public static <T> Map<String,T> fetchVarsByPrefix(String prefix) {
Map<String,T> vars = new HashMap<>();
if( prefix == null ){
return vars;
}
Map map = (Map)threadLocal.get();
Set<Map.Entry> set = map.entrySet();
for( Map.Entry entry : set ){
Object key = entry.getKey();
if( key instanceof String ){
if( ((String) key).startsWith(prefix) ){
vars.put((String)key,(T)entry.getValue());
}
}
}
return vars;
}
public static <T> T remove(String key) {
Map map = (Map)threadLocal.get();
return (T)map.remove(key);
}
public static void clear(String prefix) {
if( prefix == null ){
return;
}
Map map = (Map)threadLocal.get();
Set<Map.Entry> set = map.entrySet();
List<String> removeKeys = new ArrayList<>();
for( Map.Entry entry : set ){
Object key = entry.getKey();
if( key instanceof String ){
if( ((String) key).startsWith(prefix) ){
removeKeys.add((String)key);
}
}
}
for( String key : removeKeys ){
map.remove(key);
}
}
}
Kotlin 版
import java.util.ArrayList
import java.util.HashMap
open class ThreadLocalUtil {
companion object {
private val threadLocal = object : ThreadLocal<Map<String, Any>>() {
protected override fun initialValue(): Map<String, Any> {
return HashMap(4)
}
}
fun getThreadLocal(): Map<String, Any> {
return threadLocal.get()
}
operator fun <T> get(key: String): T {
val map: Map<String, Any> = threadLocal.get() as HashMap<String, Any>
return map[key] as T
}
operator fun <T> get(key: String, defaultValue: T): T {
val map = threadLocal.get() as HashMap<String, Any>
return if (map[key] as T == null) defaultValue else map[key] as T
}
operator fun set(key: String, value: Any) {
val amap = threadLocal.get() as HashMap<String, Any>
amap.put(key, value)
}
fun set(keyValueMap: Map<String, Any>) {
val map = threadLocal.get() as HashMap<String, Any>
map.putAll(keyValueMap)
}
fun remove() {
threadLocal.remove()
}
fun <T> fetchVarsByPrefix(prefix: String?): Map<String, T> {
val vars = HashMap<String, T>()
if (prefix == null) {
return vars
}
val map = threadLocal.get() as HashMap<String, Any>
val set = map.entries
for ((key, value) in set) {
if (key is String) {
if (key.startsWith(prefix)) {
vars.put(key, value as T)
}
}
}
return vars
}
fun <T> remove(key: String): T {
val map = threadLocal.get() as HashMap<String, Any>
return map.remove(key) as T
}
fun clear(prefix: String?) {
if (prefix == null) {
return
}
val map = threadLocal.get() as HashMap<String, Any>
val set = map.entries
val removeKeys = ArrayList<String>()
for ((key) in set) {
if (key is String) {
if (key.startsWith(prefix)) {
removeKeys.add(key)
}
}
}
for (key in removeKeys) {
map.remove(key)
}
}
}
}