| | |
| | | */ |
| | | public static <T> SerializedLambda resolve(SFunction<T, ?> func) { |
| | | Class<?> clazz = func.getClass(); |
| | | String canonicalName = clazz.getCanonicalName(); |
| | | return Optional.ofNullable(FUNC_CACHE.get(canonicalName)) |
| | | // lambda/方法引用生成的是隐藏类,getCanonicalName() 返回 null,ConcurrentHashMap 不接受 null key |
| | | String cacheKey = clazz.getCanonicalName(); |
| | | if (cacheKey == null) { |
| | | cacheKey = clazz.getName(); |
| | | } |
| | | final String key = cacheKey; |
| | | return Optional.ofNullable(FUNC_CACHE.get(key)) |
| | | .map(WeakReference::get) |
| | | .orElseGet(() -> { |
| | | SerializedLambda lambda = SerializedLambda.resolve(func); |
| | | FUNC_CACHE.put(canonicalName, new WeakReference<>(lambda)); |
| | | FUNC_CACHE.put(key, new WeakReference<>(lambda)); |
| | | return lambda; |
| | | }); |
| | | } |