Java 8一对多分组

我想学习如何将Java 8语法与流一起使用,并且有点卡住了。

当每个值都有一个键时,按组进行分组就很容易了。但是,如果我有每个值的键列表,但仍想通过groupingBy对它们进行分类,该怎么办?我是否必须将其分解为几个语句,或者是否可以通过一点流魔术来使其变得更简单。

这是基本代码:

List<Album> albums = new ArrayList<>();

Map<Artist, List<Album>> map = albums.stream().collect(Collectors.groupingBy(this::getArtist));

如果每个专辑中只有一位歌手,则效果很好。但是我必须返回一个列表,因为一个专辑可以有很多艺术家。专辑和艺术家当然是用来说明的,我有真实的类型。

可能有一个简单的解决方案,但是我有一段时间没有找到它了,所以我呼吁这个站点代表的集体大脑来解决它。:)如果不存在简单的解决方案,也欢迎使用复杂的解决方案。

在Album类中或作为以Album为参数的实用方法:

Artist getArtist(); // ok

List<Artist> getArtist(); // Not ok, since we now have many "keys" for every Album

干杯,Mikael Grev

回答:

我认为您是在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<Album> albums = asList(

new Album(

asList(

new Artist("bob"),

new Artist("tom")

)

),

new Album(asList(new Artist("bill")))

);

Map<Artist, List<Album>> 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> artist;

Album(List<Artist> artist) {

this.artist = artist;

}

List<Artist> getArtist() {

return artist;

}

}

private static <T,U> AbstractMap.SimpleEntry<T,U> pair(T t, U u) {

return new AbstractMap.SimpleEntry<T,U>(t,u);

}

}

以上是 Java 8一对多分组 的全部内容, 来源链接: utcz.com/qa/409154.html

回到顶部