java8三次分组_Java 8按一对多分组
我想你是在追踪Collectors.mapping,它可以作为第二个参数传递给groupingBy
完整的例子
import java.util.AbstractMap;
import java.util.List;
import java.util.Map;
import static java.util.Arrays.asList;
import static java.util.Map.Entry;
import static java.util.stream.Collectors.*;
public class SO {
public static void main(String... args) {
List albums = asList(
new Album(
asList(
new Artist("bob"),
new Artist("tom")
)
),
new Album(asList(new Artist("bill")))
);
Map> x = albums.stream()
.flatMap(album -> album.getArtist().stream().map(artist -> pair(artist, album)))
.collect(groupingBy(Entry::getKey, mapping(Entry::getValue, toList())));
x.entrySet().stream().forEach(System.out::println);
}
static class Artist {
private final String name;
Artist(String name) {
this.name = name;
}
public String toString() {return name;}
}
static class Album {
private List artist;
Album(List artist) {
this.artist = artist;
}
List getArtist() {
return artist;
}
}
private static AbstractMap.SimpleEntry pair(T t, U u) {
return new AbstractMap.SimpleEntry(t,u);
}
}
我想你是在追踪Collectors.mapping,它可以作为第二个参数传递给groupingBy 完整的例子 import java.util.AbstractMap; import java.util.List; import java.util.Map; import static java.util.Arrays.asList; import static java.util.Map.Entry; import static java.util.stream.Collectors.*; public class SO { public static void main(String... args) { List albums = asList( new Album( asList( new Artist("bob"), new Artist("tom") ) ), new Album(asList(new Artist("bill"))) ); Map> x = albums.stream() .flatMap(album -> album.getArtist().stream().map(artist -> pair(artist, album))) .collect(groupingBy(Entry::getKey, mapping(Entry::getValue, toList()))); x.entrySet().stream().forEach(System.out::println); } static class Artist { private final String name; Artist(String name) { this.name = name; } public String toString() {return name;} } static class Album { private List artist; Album(List artist) { this.artist = artist; } List getArtist() { return artist; } } private static AbstractMap.SimpleEntry pair(T t, U u) { return new AbstractMap.SimpleEntry(t,u); } }