private V get(final CIKey ciKey, final String key) {
        // We should have either ciKey or key
        final V val = key != null
                ? caseSensitiveMap.get(key)
                : caseSensitiveMap.get(ciKey.get());
        if (val == null) {
            final Map<String, V> subMap = caseinsensitiveMap.get(Objects.requireNonNullElseGet(
                    ciKey, () -> CIKey.of(key)));
            if (subMap == null) {
                return null;
            } else {
                if (subMap.size() > 1) {
                    throw new MultipleMatchException(
                            "Multiple keys " + subMap.keySet()
                            + " exist for case-insensitive key '"
                            + Objects.requireNonNullElseGet(key, ciKey::get)
                            + "' and there is no " +
                            "exact match.");
                } else {
                    return subMap.values().iterator().next();
                }
            }

        } else {
            return val;
        }
    }
A map that allows you to perform a lookup in both a case-sensitive and case-insensitive way
<p>
Not thread safe.
</p>
stroom-util/src/main/java/stroom/util/collections/MultiCaseMap.java