Heim >Java >javaLernprogramm >So nutzen Sie die neuen Funktionen von Java9 Stream Collectors
Neue Funktionen von Java 9 Stream Collectors
Java 8 führt Collectors ein, die zum Sammeln von Eingabeelementen in veränderlichen Containern wie Map, List und Set verwendet werden. Dieser Artikel wirft einen Blick auf die beiden neuen Collectors in Java 9: Collectors.filtering und Collectors.flatMapping, die hauptsächlich zur Bereitstellung intelligenter Elementsammlungen zusammen mit Collectors.groupingBy verwendet werden. Die
Collectors.filtering-Methode
Collectors.filtering-Methode ist ähnlich Im Vergleich zur Stream filter()-Methode wird letztere zum Filtern von Eingabeelementen verwendet, die Verwendungsszenarien der beiden sind jedoch unterschiedlich. Stream filter() wird in der Stream-Chaining-Methode verwendet, während die Collectors.filtering-Methode für die Verwendung mit groupingBy konzipiert ist.
Stream filter() filtert zunächst Elemente und gruppiert sie dann. Gefilterte Werte werden verworfen und können nicht rückwirkend nachvollzogen werden. Wenn Sie Dinge verfolgen müssen, die Sie zuerst gruppieren und dann filtern müssen, kann Collectors.filtering genau das tun.
Collectors.filtering verwendet einen Funktionsparameter, um die Eingabeparameter zu filtern und dann die gefilterten Elemente zu sammeln:
@Test public void givenList_whenSatifyPredicate_thenMapValueWithOccurences() { List<Integer> numbers = List.of(1, 2, 3, 5, 5); Map<Integer, Long> result = numbers.stream() .filter(val -> val > 3) .collect(Collectors.groupingBy(i -> i, Collectors.counting())); assertEquals(1, result.size()); result = numbers.stream() .collect(Collectors.groupingBy(i -> i, Collectors.filtering(val -> val > 3, Collectors.counting()))); assertEquals(4, result.size()); }
Collectors.flatMapping-Methode
Collectors.flatMapping ähnelt der Collectors.mapping-Methode, ist jedoch detaillierter. Beide benötigen eine Funktion und einen Kollektorparameter, um Elemente zu sammeln, aber die flatMapping-Funktion empfängt einen Strom von Elementen und führt dann eine Akkumulationsoperation über den Kollektor durch. Schauen wir uns zunächst die Modellklasse an: Die Methode
class Blog { private String authorName; private List<String> comments = new ArrayList<>(); public Blog(String authorName, String ... comment){ this.authorName = authorName; comments.addAll(Arrays.asList(comment)); } public String getAuthorName(){ return this.authorName; } public List<String> getComments(){ return comments; } }
Collectors.flatMapping überspringt die Zwischensammlung und schreibt direkt in einen einzelnen Gruppenzuordnungscontainer, der durch Collectors.groupingBy definiert wird:
@Test public void givenListOfBlogs_whenAuthorName_thenMapAuthorWithComments() { Blog blog1 = new Blog("1", "Nice", "Very Nice"); Blog blog2 = new Blog("2", "Disappointing", "Ok", "Could be better"); List<Blog> blogs = List.of(blog1, blog2); Map<String, List<List<String>>> authorComments1 = blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.mapping(Blog::getComments, Collectors.toList()))); assertEquals(2, authorComments1.size()); assertEquals(2, authorComments1.get("1").get(0).size()); assertEquals(3, authorComments1.get("2").get(0).size()); Map<String, List<String>> authorComments2 = blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.flatMapping(blog -> blog.getComments().stream(), Collectors.toList()))); assertEquals(2, authorComments2.size()); assertEquals(2, authorComments2.get("1").size()); assertEquals(3, authorComments2.get("2").size()); }
Collectors.mapping ordnet alle Gruppierungswerte (Kommentare des Autors) zu in einem Container gesammelt, z. B. List. Und löschen Sie die Zwischensammlung und speichern Sie die Sammlung direkt im Container des Sammlers.
Das obige ist der detaillierte Inhalt vonSo nutzen Sie die neuen Funktionen von Java9 Stream Collectors. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!