Как сделать CaseInsensitiveConcurrentMap?

Как я могу реализовать

class CaseInsensitiveConcurrentMap<V> implements ConcurrentMap<String , V>

который работает так же, как ConcurrentHashMap<String , V>, за исключением того, что ключи сравниваются без учета регистра? Ключи не должны быть преобразованы в строчные или прописные.

Обратите внимание, что Collections.synchronizedMap(new TreeMap<String, new MyCaseInsensitiveComparator()) не является решением, так как он не позволяет concurrency и пропускает дополнительные методы.

Создание String-подобного класса с нечувствительностью к регистру equals и hashCode тоже не является параметром, так как карта должна быть передана методам, ожидающим строки как ключи.

Ответ 1

Вы пробовали

ConcurrentMap<String, Object> map = 
    new ConcurrentSkipListMap<String, Object>(
        String.CASE_INSENSITIVE_ORDER);

Ответ 2

Если вы действительно настаиваете на всех своих ограничениях (ConcurrentHashMap) и строковых ключах:

Перезаписать любой метод ConcurrentHashMap и преобразовать любой ключ с ключом = key.toLowerCase().

Похоже на большую работу и много модульного тестирования, поэтому, если бы я был вами, я бы попытался обсудить интерфейс.

Пример:

@Overwrite
public void V get(String key) {
  return super.get(transform(key));
}

// Extracted that to avoid cluttering your whole code with that specific transformation
// So you can easily change it
private String transform(String key) {
  return key.toLowerCase();
}

Ужасно, но, учитывая ваши ограничения, выполнимо.