ConcurrentMapTools.java

package eu.javaexperience.collection.map;

import java.util.concurrent.ConcurrentMap;

import eu.javaexperience.interfaces.simple.getBy.GetBy1;

public class ConcurrentMapTools
{
	public static <R,P> R getOrCreate
	(
		ConcurrentMap<P,R> map,
		P key,
		GetBy1<R,P> factory
	)
	{
		R ret = map.get(key);
		if(null == ret)
		{
			R cre = factory.getBy(key);
			if(null == cre)
			{
				return null;
			}
			
			ret = map.putIfAbsent(key, cre);
			if(null != ret)
			{
				return ret;
			}
			
			return cre;
		}
		
		return ret;
	}
}