美文网首页
一个优雅的 ThreadLocal 工具类

一个优雅的 ThreadLocal 工具类

作者: JennTu | 来源:发表于2019-04-16 23:47 被阅读0次

    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)
                }
            }
        }
    
    }
    

    相关文章

      网友评论

          本文标题:一个优雅的 ThreadLocal 工具类

          本文链接:https://www.haomeiwen.com/subject/msywwqtx.html