[Eu venho de background em C #, mas a resposta deve ser aplicada]
[Não importa muito, mas presumo que o último item seja ConcurrentHashMap <C, Inteiro> ]
Você tem uma função f do tipo A -> (B -> (C -> int)).
Se é realmente o que você precisa, não tenho uma resposta pronta. Mas talvez, ter uma função f do tipo (A x B x C) -> int seja suficiente para seus propósitos.
A diferença entre dois casos é que o primeiro é mais preguiçoso, mais funcional, sem dúvida mais elegante e é possível ter uma função "parcialmente aplicada". Por exemplo, você tem uma um (do tipo A) elemento, você aplicar um para f e têm uma função g do tipo (B -> (C -> int)) para passar ao redor, enviar para métodos, seja qual for. No entanto, é um pouco complicado e um pouco mais de código para inicializar corretamente a função.
O segundo é mais ávido e menos elegante, mas pode ser mais fácil codificar e entender. Tudo que você precisa fazer é ter uma classe genérica Triple <A, B, C> , substituir Equals () e GetHashCode () para que ela tenha semântica de valor (duas instâncias serão consideradas iguais se tiverem elementos iguais) e declare que o ConcurrentHashMap é de Triplo para Inteiro . O custo mais óbvio a pagar é que você precisa ter os elementos A , B , C prontos de uma só vez para criar uma instância do Triple e executar a pesquisa.
Edit: Se o último item for realmente ConcurrentHashMap <C, Inteiro> , sua classe genérica terá campos A , B e Inteiro , e o mapeamento será de Triplo <A, B, Inteiro> para C
A
,B
eC
? Seria mais fácil responder se eu pudesse entender o significado do aninhamento em três níveis dos seus mapas lá.