Java 8 groupingby mit benutzerdefinierten Schlüssel
Habe ich eine Reihe von Eingabe-Strings im folgenden format:
typeA:code1,
typeA:code2,
typeA:code3,
typeB:code4,
typeB:code5,
typeB:code6,
typeC:code7,
...
und ich brauche, um eine Map<String, List<String>>
mit der folgenden Struktur:
typeA, [code1, code2, code3]
typeB, [code4, code5, code6]
typeC, [code7, code8, ...]
Der Haken ist, dass zum generieren der einzelnen geben, die ich brauche, um eine Funktion aufzurufen, wie in diesem Fall auf jeden input String:
public static String getType(String code)
{
return code.split(":")[0]; //yes this is horrible code, it's just for the example, honestly
}
Ich bin ziemlich zuversichtlich, dass Bäche und Sammler kann dies tun, aber ich bin kämpfen, um die richtige Beschwörungsformel zu zaubern, um Sie geschehen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Weg, es zu tun (vorausgesetzt die Klasse ist benannt
A
):Wenn Sie möchten, dass die Ausgabe sortiert, Sie können eine TreeMap anstelle der Standard-HashMap:
Vollständigen Beispiel:
Der code wird einfach, wenn man bedenkt, was Sie ausgelassen haben, dass müssen Sie den zweiten Teil der split-string-sowie:
(vorausgesetzt, Sie haben eine
import static java.util.stream.Collectors.*;
)Es ist nichts falsch mit der Aufteilung eines
String
in ein array, die Umsetzung hat sogar ein "fast-path" für den häufigen Fall, Sie Spalten mit einem einfachen Charakter, anstatt einer komplizierten regulären Ausdruck.Obwohl ich war zu langsam, hier ist ein MCVE zeigen, wie dies gelöst werden kann mit
Collectors#groupingBy
.Gibt es natürlich verschiedene Optionen für die Definition der "classifier" und "mapper". Hier bin ich einfach mit
String#substring
den Teil vor und nach der":"
.