MYFACES-4337 [perf] avoid lambda instances / computeIfAbsent
diff --git a/api/src/main/java/javax/faces/component/UIComponent.java b/api/src/main/java/javax/faces/component/UIComponent.java
index 2fd8426..b9657ba 100755
--- a/api/src/main/java/javax/faces/component/UIComponent.java
+++ b/api/src/main/java/javax/faces/component/UIComponent.java
@@ -888,8 +888,12 @@
             _systemEventListenerClassMap = new HashMap<>(4, 1f);
         }
 
-        List<SystemEventListener> listeners = _systemEventListenerClassMap.computeIfAbsent(eventClass,
-                k -> new _DeltaList<>(3));
+        List<SystemEventListener> listeners = _systemEventListenerClassMap.get(eventClass);
+        if (listeners == null)
+        {
+            listeners = new _DeltaList<>(3);
+            _systemEventListenerClassMap.put(eventClass, listeners);
+        }
 
         // Deal with contains? Spec is silent
         listeners.add(listener);
@@ -1239,8 +1243,14 @@
 
             if (currentComponent != null)
             {
-                List<UIComponent> componentStack = (List<UIComponent>) contextAttributes.computeIfAbsent(
-                                UIComponent._COMPONENT_STACK, k -> new ArrayList<>());
+                List<UIComponent> componentStack = (List<UIComponent>)
+                        contextAttributes.get(UIComponent._COMPONENT_STACK);
+                if (componentStack == null)
+                {
+                    componentStack = new ArrayList<>();
+                    contextAttributes.put(UIComponent._COMPONENT_STACK, componentStack);
+                }
+
                 componentStack.add(currentComponent);
             }
 
@@ -1256,8 +1266,13 @@
         }
         else
         {
-            List<UIComponent> componentStack = (List<UIComponent>) contextAttributes.computeIfAbsent(
-                    UIComponent._COMPONENT_STACK, k -> new ArrayList<>());
+            List<UIComponent> componentStack = (List<UIComponent>) contextAttributes.get(UIComponent._COMPONENT_STACK);
+            if (componentStack == null)
+            {
+                componentStack = new ArrayList<>();
+                contextAttributes.put(UIComponent._COMPONENT_STACK, componentStack);
+            }
+
             componentStack.add(component);
             if (component._isCompositeComponent())
             {
diff --git a/api/src/main/java/javax/faces/component/UIComponentBase.java b/api/src/main/java/javax/faces/component/UIComponentBase.java
index 433de7b..4838e8b 100755
--- a/api/src/main/java/javax/faces/component/UIComponentBase.java
+++ b/api/src/main/java/javax/faces/component/UIComponentBase.java
@@ -345,9 +345,13 @@
                 _behaviorsMap = new HashMap<>(5, 1f);
             }
 
-            // Normally have client only 1 client behaviour per event name, so size 2 must be sufficient:
-            List<ClientBehavior> behaviorsForEvent = _behaviorsMap.computeIfAbsent(eventName,
-                    k -> new _DeltaList<>(2));
+            List<ClientBehavior> behaviorsForEvent = _behaviorsMap.get(eventName);
+            if (behaviorsForEvent == null)
+            {
+                // Normally have client only 1 client behaviour per event name, so size 2 must be sufficient:
+                behaviorsForEvent = new _DeltaList<>(2);
+                _behaviorsMap.put(eventName, behaviorsForEvent);
+            }
 
             behaviorsForEvent.add(behavior);
             _unmodifiableBehaviorsMap = null;
diff --git a/api/src/main/java/javax/faces/component/_DeltaStateHelper.java b/api/src/main/java/javax/faces/component/_DeltaStateHelper.java
index 0f4b627..1b9e089 100644
--- a/api/src/main/java/javax/faces/component/_DeltaStateHelper.java
+++ b/api/src/main/java/javax/faces/component/_DeltaStateHelper.java
@@ -303,14 +303,24 @@
         if (_createDeltas(key))
         {
             //Track delta case
-            Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.computeIfAbsent(key,
-                    k -> new InternalDeltaListMap<>(3));
+            Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.get(key);
+            if (deltaListMapValues == null)
+            {
+                deltaListMapValues = new InternalDeltaListMap<>(3);
+                _deltas.put(key, deltaListMapValues);
+            }
+
             deltaListMapValues.put(value, Boolean.TRUE);
         }
 
         //Handle change on full map
-        List<Object> fullListValues = (List<Object>) _fullState.computeIfAbsent(key,
-                k -> new InternalList<>(3));
+        List<Object> fullListValues = (List<Object>) _fullState.get(key);
+        if (fullListValues == null)
+        {
+            fullListValues = new InternalList<>(3);
+            _fullState.put(key, fullListValues);
+        }
+
         fullListValues.add(value);
     }
 
@@ -388,8 +398,13 @@
         if (_createDeltas(key))
         {
             //Track delta case
-            Map<String, Object> mapValues = (Map<String, Object>) _deltas.computeIfAbsent(key,
-                    k -> new InternalMap<>());
+            Map<String, Object> mapValues = (Map<String, Object>) _deltas.get(key);
+            if (mapValues == null)
+            {
+                mapValues = new InternalMap<>();
+                _deltas.put(key, mapValues);
+            }
+
             if (mapValues.containsKey(mapKey))
             {
                 returnValue = mapValues.put(mapKey, value);
@@ -402,8 +417,13 @@
         }
 
         //Handle change on full map
-        Map<String, Object> mapValues = (Map<String, Object>) _fullState.computeIfAbsent(key,
-                k -> new InternalMap<>());
+        Map<String, Object> mapValues = (Map<String, Object>) _fullState.get(key);
+        if (mapValues == null)
+        {
+            mapValues = new InternalMap<>();
+            _fullState.put(key, mapValues);
+        }
+
         if (returnSet)
         {
             mapValues.put(mapKey, value);
diff --git a/api/src/main/java/javax/faces/component/behavior/_AjaxBehaviorDeltaStateHelper.java b/api/src/main/java/javax/faces/component/behavior/_AjaxBehaviorDeltaStateHelper.java
index 6e5b3df..aed08f4 100644
--- a/api/src/main/java/javax/faces/component/behavior/_AjaxBehaviorDeltaStateHelper.java
+++ b/api/src/main/java/javax/faces/component/behavior/_AjaxBehaviorDeltaStateHelper.java
@@ -100,13 +100,24 @@
         if (_createDeltas())
         {
             //Track delta case
-            Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.computeIfAbsent(key,
-                    k -> new InternalDeltaListMap<>(3, 1f));
+            Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.get(key);
+            if (deltaListMapValues == null)
+            {
+                deltaListMapValues = new InternalDeltaListMap<>(3, 1f);
+                _deltas.put(key, deltaListMapValues);
+            }
+
             deltaListMapValues.put(value, Boolean.TRUE);
         }
 
         //Handle change on full map
-        List<Object> fullListValues = (List<Object>) _fullState.computeIfAbsent(key, k -> new InternalList<>(3));
+        List<Object> fullListValues = (List<Object>) _fullState.get(key);
+        if (fullListValues == null)
+        {
+            fullListValues = new InternalList<>(3);
+            _fullState.put(key, fullListValues);
+        }
+
         fullListValues.add(value);
     }
 
@@ -180,8 +191,13 @@
         if (_createDeltas())
         {
             //Track delta case
-            Map<String, Object> mapValues = (Map<String, Object>) _deltas.computeIfAbsent(key,
-                    k -> new InternalMap<>(8, 1f));
+            Map<String, Object> mapValues = (Map<String, Object>) _deltas.get(key);
+            if (mapValues == null)
+            {
+                mapValues = new InternalMap<>(8, 1f);
+                _deltas.put(key, mapValues);
+            }
+
             if (mapValues.containsKey(mapKey))
             {
                 returnValue = mapValues.put(mapKey, value);
@@ -194,8 +210,13 @@
         }
 
         //Handle change on full map
-        Map<String, Object> mapValues = (Map<String, Object>) _fullState.computeIfAbsent(key,
-                k -> new InternalMap<>(8, 1f));
+        Map<String, Object> mapValues = (Map<String, Object>) _fullState.get(key);
+        if (mapValues == null)
+        {
+            mapValues = new InternalMap<>(8, 1f);
+            _fullState.put(key, mapValues);
+        }
+
         if (returnSet)
         {
             mapValues.put(mapKey, value);
diff --git a/api/src/main/java/javax/faces/component/behavior/_DeltaStateHelper.java b/api/src/main/java/javax/faces/component/behavior/_DeltaStateHelper.java
index c82b36b..1f8dbc8 100644
--- a/api/src/main/java/javax/faces/component/behavior/_DeltaStateHelper.java
+++ b/api/src/main/java/javax/faces/component/behavior/_DeltaStateHelper.java
@@ -195,14 +195,24 @@
         if (_createDeltas())
         {
             //Track delta case
-            Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.computeIfAbsent(key,
-                    k -> new InternalDeltaListMap<>(3, 1f));
+            Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.get(key);
+            if (deltaListMapValues == null)
+            {
+                deltaListMapValues = new InternalDeltaListMap<>(3, 1f);
+                _deltas.put(key, deltaListMapValues);
+            }
+
             deltaListMapValues.put(value, Boolean.TRUE);
         }
 
         //Handle change on full map
-        List<Object> fullListValues = (List<Object>) _fullState.computeIfAbsent(key,
-                k -> new InternalList<>(3));
+        List<Object> fullListValues = (List<Object>) _fullState.get(key);
+        if (fullListValues == null)
+        {
+            fullListValues = new InternalList<>(3);
+            _fullState.put(key, fullListValues);
+        }
+
         fullListValues.add(value);
     }
 
@@ -279,8 +289,13 @@
         if (_createDeltas())
         {
             //Track delta case
-            Map<String, Object> mapValues = (Map<String, Object>) _deltas.computeIfAbsent(key,
-                    k -> new InternalMap<>());
+            Map<String, Object> mapValues = (Map<String, Object>) _deltas.get(key);
+            if (mapValues == null)
+            {
+                mapValues = new InternalMap<>();
+                _deltas.put(key, mapValues);
+            }
+
             if (mapValues.containsKey(mapKey))
             {
                 returnValue = mapValues.put(mapKey, value);
@@ -293,8 +308,13 @@
         }
 
         //Handle change on full map
-        Map<String, Object> mapValues = (Map<String, Object>) _fullState.computeIfAbsent(key,
-                k -> new InternalMap<>());
+        Map<String, Object> mapValues = (Map<String, Object>) _fullState.get(key);
+        if (mapValues == null)
+        {
+            mapValues = new InternalMap<>();
+            _fullState.put(key, mapValues);
+        }
+
         if (returnSet)
         {
             mapValues.put(mapKey, value);
diff --git a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
index b0b7b3d..310fd81 100755
--- a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
@@ -20,9 +20,6 @@
 
 import java.beans.BeanDescriptor;
 import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
 import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -34,7 +31,6 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.MissingResourceException;
-import java.util.Objects;
 import java.util.TimeZone;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -121,6 +117,9 @@
 import org.apache.myfaces.flow.FlowHandlerImpl;
 import org.apache.myfaces.lifecycle.LifecycleImpl;
 import org.apache.myfaces.config.MyfacesConfig;
+import org.apache.myfaces.core.api.shared.lang.LambdaPropertyDescriptor;
+import org.apache.myfaces.core.api.shared.lang.PropertyDescriptorUtils;
+import org.apache.myfaces.core.api.shared.lang.PropertyDescriptorWrapper;
 import org.apache.myfaces.util.lang.Assert;
 import org.apache.myfaces.util.lang.ClassUtils;
 import org.apache.myfaces.util.lang.Lazy;
@@ -219,9 +218,6 @@
     
     private SearchKeywordResolver _searchExpressionResolver;
 
-    private Map<Class<?>, Map<String, PropertyDescriptor>> converterPDCache
-            = new ConcurrentHashMap<>();
-
     /**
      * Represents semantic null in _componentClassMap. 
      */
@@ -984,12 +980,21 @@
 
         try
         {
-            boolean managed = _cdiManagedBehaviorMap.computeIfAbsent(behaviorClass, k ->
+            if (!_cdiManagedBehaviorMap.containsKey(behaviorClass))
             {
-                FacesBehavior annotation = k.getAnnotation(FacesBehavior.class);
-                return annotation == null ? false : annotation.managed();
-            });
-            
+                FacesBehavior annotation = behaviorClass.getAnnotation(FacesBehavior.class);
+                if (annotation != null && annotation.managed())
+                {
+                    _cdiManagedBehaviorMap.put(behaviorClass, true);
+                }
+                else
+                {
+                    _cdiManagedBehaviorMap.put(behaviorClass, false);
+                }
+            }
+
+            boolean managed = _cdiManagedBehaviorMap.get(behaviorClass);
+
             Behavior behavior = null;
             if (managed)
             {
@@ -1338,12 +1343,21 @@
 
         try
         {
-            boolean managed = _cdiManagedConverterMap.computeIfAbsent(converterClass, k ->
+            if (!_cdiManagedConverterMap.containsKey(converterClass))
             {
-                FacesConverter annotation = k.getAnnotation(FacesConverter.class);
-                return annotation == null ? false : annotation.managed();
-            });
+                FacesConverter annotation = converterClass.getAnnotation(FacesConverter.class);
+                if (annotation != null && annotation.managed())
+                {
+                    _cdiManagedConverterMap.put(converterClass, true);
+                }
+                else
+                {
+                    _cdiManagedConverterMap.put(converterClass, false);
+                }
+            }
             
+            boolean managed = _cdiManagedConverterMap.get(converterClass);
+
             Converter converter = null;
             if (managed)
             {
@@ -1562,42 +1576,29 @@
 
         if (converterConfig != null && !converterConfig.getProperties().isEmpty())
         {
-            Map<String, PropertyDescriptor> pds = converterPDCache.computeIfAbsent(converterClass, c ->
-            {
-                HashMap<String, PropertyDescriptor> map = new HashMap<>(converterConfig.getProperties().size());
-                try
-                {
-                    for (PropertyDescriptor pd : Introspector.getBeanInfo(c).getPropertyDescriptors())
-                    {
-                        for (Property property : converterConfig.getProperties())
-                        {
-                            if (Objects.equals(pd.getName(), property.getPropertyName()))
-                            {
-                                map.put(property.getPropertyName(), pd);
-                            }
-                        }
-                    }
-                }
-                catch (IntrospectionException e)
-                {
-                    log.log(Level.SEVERE,
-                            "Could not read properties for setting default values of converter: "
-                                    + converterClass.getSimpleName(),
-                            e);
-                }
-                return map;
-            });
+            Map<String, ? extends PropertyDescriptorWrapper> pds = PropertyDescriptorUtils.getPropertyDescriptors(
+                    FacesContext.getCurrentInstance().getExternalContext(),
+                    converterClass);
 
             for (int i = 0; i < converterConfig.getProperties().size(); i++)
             {
                 Property property = converterConfig.getProperties().get(i);
                 try
                 {
-                    PropertyDescriptor pd = pds.get(property.getPropertyName());
+                    PropertyDescriptorWrapper pd = pds.get(property.getPropertyName());
                     // see MYFACES-2602 - skip set value if it was already set via constructor and now != null
                     if (!pd.getPropertyType().isPrimitive())
                     {
-                        Object defaultValue = pd.getReadMethod().invoke(converter);
+                        Object defaultValue;
+                        if (pd instanceof LambdaPropertyDescriptor)
+                        {
+                            defaultValue = ((LambdaPropertyDescriptor) pd).getReadFunction().apply(converter);
+                        }
+                        else
+                        {
+                            defaultValue = pd.getReadMethod().invoke(converter);
+                        }
+
                         if (defaultValue != null)
                         {
                             continue;
@@ -1605,7 +1606,14 @@
                     }
 
                     Object convertedValue = ClassUtils.convertToType(property.getDefaultValue(), pd.getPropertyType());
-                    pd.getWriteMethod().invoke(converter, convertedValue);
+                    if (pd instanceof LambdaPropertyDescriptor)
+                    {
+                        ((LambdaPropertyDescriptor) pd).getWriteFunction().accept(converter, convertedValue);
+                    }
+                    else
+                    {
+                        pd.getWriteMethod().invoke(converter, convertedValue);
+                    }
                 }
                 catch (Throwable th)
                 {
@@ -1640,26 +1648,28 @@
             _classToResourceDependencyMap.remove(inspectedClass);
         }
         
-        List<ResourceDependency> dependencyList = _classToResourceDependencyMap.computeIfAbsent(inspectedClass, k ->
+        List<ResourceDependency> dependencyList = _classToResourceDependencyMap.get(inspectedClass);
+        if (dependencyList == null)
         {
-            List<ResourceDependency> values = new ArrayList<>(5);
+            dependencyList = new ArrayList<>(5);
 
-            ResourceDependency dependency = k.getAnnotation(ResourceDependency.class);
+            ResourceDependency dependency = inspectedClass.getAnnotation(ResourceDependency.class);
             if (dependency != null)
             {
-                values.add(dependency);
+                dependencyList.add(dependency);
             }
 
-            ResourceDependencies dependencies = k.getAnnotation(ResourceDependencies.class);
+            ResourceDependencies dependencies = inspectedClass.getAnnotation(ResourceDependencies.class);
             if (dependencies != null)
             {
-                values.addAll(Arrays.asList(dependencies.value()));
+                dependencyList.addAll(Arrays.asList(dependencies.value()));
             }
 
-            return values.isEmpty() ? Collections.emptyList() : values;
-        });
+            _classToResourceDependencyMap.put(inspectedClass,
+                    dependencyList.isEmpty() ? Collections.emptyList() : dependencyList);
+        }
 
-        if (dependencyList != null && !dependencyList.isEmpty()) 
+        if (!dependencyList.isEmpty()) 
         {
             for (int i = 0, size = dependencyList.size(); i < size; i++)
             {
@@ -1826,12 +1836,21 @@
 
         try
         {
-            boolean managed = _cdiManagedValidatorMap.computeIfAbsent(validatorClass, k -> 
+            if (!_cdiManagedValidatorMap.containsKey(validatorClass))
             {
-                FacesValidator annotation = k.getAnnotation(FacesValidator.class);
-                return annotation == null ? false : annotation.managed();
-            });
+                FacesValidator annotation = validatorClass.getAnnotation(FacesValidator.class);
+                if (annotation != null && annotation.managed())
+                {
+                    _cdiManagedValidatorMap.put(validatorClass, true);
+                }
+                else
+                {
+                    _cdiManagedValidatorMap.put(validatorClass, false);
+                }
+            }
             
+            boolean managed = _cdiManagedValidatorMap.get(validatorClass);
+
             Validator validator = null;
             if (managed)
             {
@@ -1964,27 +1983,29 @@
             _classToListenerForMap.remove(inspectedClass);
         }
 
-        List<ListenerFor> listenerForList = _classToListenerForMap.computeIfAbsent(inspectedClass, k ->
+        List<ListenerFor> listenerForList = _classToListenerForMap.get(inspectedClass);
+        if (listenerForList == null)
         {
-            List<ListenerFor> values = new ArrayList<>();
-            
-            ListenerFor listener = k.getAnnotation(ListenerFor.class);
+            listenerForList = new ArrayList<>(5);
+
+            ListenerFor listener = inspectedClass.getAnnotation(ListenerFor.class);
             if (listener != null)
             {
-                values.add(listener);
+                listenerForList.add(listener);
             }
 
-            ListenersFor listeners = k.getAnnotation(ListenersFor.class);
+            ListenersFor listeners = inspectedClass.getAnnotation(ListenersFor.class);
             if (listeners != null)
             {
-                values.addAll(Arrays.asList(listeners.value()));
+                listenerForList.addAll(Arrays.asList(listeners.value()));
             }
             
-            return values.isEmpty() ? Collections.emptyList() : values;
-        });
+            _classToListenerForMap.put(inspectedClass, 
+                    listenerForList.isEmpty() ? Collections.emptyList() : listenerForList);
+        }
 
         // listeners were found through inspection or from cache, handle them
-        if (listenerForList != null && !listenerForList.isEmpty()) 
+        if (!listenerForList.isEmpty()) 
         {
             for (int i = 0, size = listenerForList.size(); i < size; i++)
             {
diff --git a/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java b/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java
index 56f4331..6170fc5 100644
--- a/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java
+++ b/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java
@@ -113,9 +113,13 @@
     public void subscribeToEvent(Class<? extends SystemEvent> systemEventClass, Class<?> sourceClass,

                                  SystemEventListener listener)

     {

-        List<EventInfo> eventInfos = globalListeners.computeIfAbsent(systemEventClass,

-                k -> new CopyOnWriteArrayList<>());

-        

+        List<EventInfo> eventInfos = globalListeners.get(systemEventClass);

+        if (eventInfos == null)

+        {

+            eventInfos = new CopyOnWriteArrayList<>();

+            globalListeners.put(systemEventClass, eventInfos);

+        }

+

         EventInfo eventInfo = new EventInfo();

         eventInfo.systemEventClass = systemEventClass;

         eventInfo.sourceClass = sourceClass;

diff --git a/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java b/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
index 088523c..6757d9d 100755
--- a/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
@@ -1137,7 +1137,12 @@
                             // ignore includeViewParams, faces-include-view-params and faces-redirect
                             continue;
                         }
-                        List<String> paramValues = params.computeIfAbsent(splitParam[0], k -> new ArrayList<>());
+                        List<String> paramValues = params.get(splitParam[0]);
+                        if (paramValues == null)
+                        {
+                            paramValues = new ArrayList<>(5);
+                            params.put(splitParam[0], paramValues);
+                        }
                         paramValues.add(splitParam[1]);
                     }
                     else
diff --git a/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheServerSide.java b/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheServerSide.java
index cc86326..eedbc81 100644
--- a/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheServerSide.java
+++ b/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheServerSide.java
@@ -136,8 +136,13 @@
     protected void saveSerializedViewInSession(FacesContext context, Object serializedView)
     {
         Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
-        SerializedViewCollection viewCollection = (SerializedViewCollection) sessionMap.computeIfAbsent(
-                SERIALIZED_VIEW_SESSION_ATTR, k -> sessionViewStorageFactory.createSerializedViewCollection(context));
+        SerializedViewCollection viewCollection = (SerializedViewCollection)
+                sessionMap.get(SERIALIZED_VIEW_SESSION_ATTR);
+        if (viewCollection == null)
+        {
+            viewCollection = sessionViewStorageFactory.createSerializedViewCollection(context);
+            sessionMap.put(SERIALIZED_VIEW_SESSION_ATTR, viewCollection);
+        }
 
         Map<Object,Object> attributeMap = context.getAttributes();
         
diff --git a/impl/src/main/java/org/apache/myfaces/component/visit/PartialVisitContext.java b/impl/src/main/java/org/apache/myfaces/component/visit/PartialVisitContext.java
index 7fa3f0f..eba2810 100644
--- a/impl/src/main/java/org/apache/myfaces/component/visit/PartialVisitContext.java
+++ b/impl/src/main/java/org/apache/myfaces/component/visit/PartialVisitContext.java
@@ -343,8 +343,12 @@
                 // NamingContainer client id.  If not, create the
                 // Collection for this NamingContainer client id and
                 // stash it away in our map
-                Collection<String> c = _subtreeClientIds.computeIfAbsent(namingContainerClientId,
-                        k -> new ArrayList<>(5));
+                Collection<String> c = _subtreeClientIds.get(namingContainerClientId);
+                if (c == null)
+                {
+                    c = new ArrayList<>(5);
+                    _subtreeClientIds.put(namingContainerClientId, c);
+                }
 
                 // Stash away the client id
                 c.add(clientId);
diff --git a/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java b/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java
index ed4c201..5fd5b1f 100644
--- a/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java
+++ b/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java
@@ -84,7 +84,7 @@
         
         if (create && map == null)
         {
-            map = new HashMap<>();
+            map = new HashMap<>(5);
             ctx.getAttributes().put(VIEW_CONTEXT_KEY, map);
         }
 
diff --git a/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java b/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java
index 53126d5..b49bd95 100644
--- a/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java
+++ b/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java
@@ -736,8 +736,13 @@
         if (fcc.isUsingPSSOnThisView() && !fcc.isRefreshTransientBuildOnPSSPreserveState())
         {
             UIViewRoot root = getViewRoot(ctx, parent);
-            FaceletState map = (FaceletState) root.getAttributes().computeIfAbsent(FACELET_STATE_INSTANCE,
-                    k -> new FaceletState());
+            FaceletState map = (FaceletState) root.getAttributes().get(FACELET_STATE_INSTANCE);
+            if (map == null)
+            {
+                map = new FaceletState();
+                root.getAttributes().put(FACELET_STATE_INSTANCE, map);
+            }
+
             map.putState(uniqueId, value);
         }
     }
diff --git a/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/FaceletState.java b/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/FaceletState.java
index 1ef77ed..9bb572b 100644
--- a/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/FaceletState.java
+++ b/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/FaceletState.java
@@ -140,7 +140,13 @@
             bindingsMap = new HashMap<>();
         }
 
-        Map<String, ValueExpression> bindings = bindingsMap.computeIfAbsent(uniqueId, k -> new HashMap<>());
+        Map<String, ValueExpression> bindings = bindingsMap.get(uniqueId);
+        if (bindings == null)
+        {
+            bindings = new HashMap<>();
+            bindingsMap.put(uniqueId, bindings);
+        }
+
         bindings.put(key, expr);
     }