一个优雅的 ThreadLocal 工具类

2019-04-16  本文已影响0人  JennTu

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

}
上一篇下一篇

猜你喜欢

热点阅读