首页 / JAVA / Java 8按一对多分组
Java 8按一对多分组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java 8按一对多分组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1905字,纯文字阅读大概需要3分钟。
内容图文
![Java 8按一对多分组](/upload/InfoBanner/zyjiaocheng/706/02263abd27a3436fb43530ffe72a7e47.jpg)
我想学习如何使用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
干杯,
米卡尔格雷夫
解决方法:
我想你是在追踪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按一对多分组全部内容,希望文章能够帮你解决Java 8按一对多分组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。