gpt4 book ai didi

Java 8 一对多分组

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:07 28 4
gpt4 key购买 nike

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

当每个值都有一个键时,分组就很容易了。但是,如果我有一个包含每个值的键列表并且仍然想使用 groupingBy 对它们进行分类怎么办?我是否必须将其分解为多个语句,或者是否可以使用一些流魔术来使其更简单。

这是基本代码:

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

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

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

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

Artist getArtist(); // ok

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

干杯,迈克尔·格雷夫

最佳答案

我想你在 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 一对多分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23423078/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com