Partitionieren einer Liste von Prädikat mit java8?
Habe ich eine Liste a
denen ich aufteilen will, um paar kleine Listen.
sagen, alle die Elemente enthält, die mit "aaa", die alle enthält, die mit "bbb" und einige weitere Prädikate.
Wie kann ich das tun mit java8?
Sah ich dieses post aber nur eine Aufteilung auf 2 Listen.
public void partition_list_java8() {
Predicate<String> startWithS = p -> p.toLowerCase().startsWith("s");
Map<Boolean, List<String>> decisionsByS = playerDecisions.stream()
.collect(Collectors.partitioningBy(startWithS));
logger.info(decisionsByS);
assertTrue(decisionsByS.get(Boolean.TRUE).size() == 3);
}
Sah ich dieses post, aber es war sehr alt, vor java 8.
- Ein Prädikat ist boolean. Es hat nur ein "true" und "false". Ich denke, es wäre besser, verwenden
Function
undCollectors::groupingBy
in Ihrem Fall.
InformationsquelleAutor Elad Benda | 2016-04-17
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie es erklärt wurde, in @RealSkeptic Kommentar
Predicate
zurückgeben kann nur zwei Ergebnisse haben: wahr und falsch. Dies bedeutet, dass Sie in der Lage sein würde, teilen Sie Ihre Daten nur in zwei Gruppen.Was Sie brauchen, ist eine Art von
Function
die Ihnen erlauben, zu bestimmen, einige gemeinsame Ergebnis für die Elemente, die gruppiert werden sollen, zusammen. In Ihrem Fall ist eine solche Folge könnte sein, erste Zeichen in seiner Kleinbuchstaben (unter der Annahme, dass alle strings nicht leer sind - mindestens ein Zeichen).Nun mit
Sammler.groupingBy(function)
gruppieren Sie alle Elemente in separate Listen, und speichern Sie Sie in die Karte, wo der Schlüssel werden gemeinsame Ergebnis verwendet für die Gruppierung (wie erste Zeichen).So kann der code Aussehen
Ausgabe:
Können Sie
Sammler.groupingBy
verwandeln Sie Ihr stream (Zusammenfassung) -> (Liste der Dinge, die in dieser Gruppierung). Wenn Sie kümmern sich nicht um die Gruppierungen selbst, dann rufen Sievalues()
auf die Karte zu bekommenCollection<List<String>>
Ihre Partitionen.