[Ich komme aus dem C # -Hintergrund, aber die Antwort sollte zutreffen]
[Es spielt keine große Rolle, aber ich gehe davon aus, dass das letzte Element ConcurrentHashMap <C, Integer> ist. ]
Sie haben eine Funktion f vom Typ A -> (B -> (C -> int))
Wenn es wirklich das ist, was Sie brauchen, habe ich keine Antwort parat. Aber vielleicht würde eine Funktion f vom Typ (A x B x C) -> int für Ihre Zwecke ausreichen.
Der Unterschied zwischen zwei Fällen besteht darin, dass der erste fauler, funktionaler, wohl eleganter ist und es möglich ist, eine "teilweise angewendete" Funktion zu haben. Zum Beispiel haben Sie ein a- Element (vom Typ A), Sie wenden a auf f an und haben eine Funktion g vom Typ (B -> (C -> int)) , die Sie weitergeben, an Methoden senden können, was auch immer. Es ist jedoch etwas umständlich und etwas mehr Code, um die Funktion richtig zu initialisieren.
Die zweite ist eifriger und weniger elegant, aber möglicherweise einfacher zu codieren und zu verstehen. Alles, was Sie tun müssen, ist eine generische Klasse Triple <A, B, C> , die Equals () und GetHashCode () überschreibt, damit sie eine Wertesemantik aufweist (zwei Instanzen sind als gleich anzusehen, wenn sie gleiche Elemente haben). und deklarieren Sie, dass die ConcurrentHashMap von Triple bis Integer ist . Die offensichtlichsten Kosten sind, dass Sie die Elemente A , B , C auf einmal bereithalten müssen, um eine Instanz von Triple zu erstellen und die Suche durchzuführen.
Bearbeiten: Wenn das letzte Element wirklich ConcurrentHashMap <C, Integer> ist , hat Ihre generische Klasse A- , B- und Integer- Felder, und die Zuordnung erfolgt von Triple <A, B, Integer> zu C.
A
,B
undC
? Es wäre einfacher zu beantworten, wenn ich die Bedeutung der dreistufigen Verschachtelung Ihrer Karten verstehen könnte.