当前位置: 首页 > 面试题库 >

Java 8一对多分组

冀翰翮
2023-03-14
问题内容

我想学习如何将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);
    }


}


 类似资料:
  • 问题内容: 好的,所以这可能是一个琐碎的问题,但是我在可视化和理解差异以及何时使用它们方面遇到困难。对于诸如单向和双向映射之类的概念如何影响一对多/多对多关系,我也还不清楚。我现在正在使用Hibernate,因此任何与ORM相关的解释都将有所帮助。 举例来说,我有以下设置: 那么在这种情况下,我将进行哪种映射?对于这个特定示例的答案肯定会受到赞赏,但我也确实希望获得何时使用一对多和多对多以及何时使

  • 一对多 多对一 关联模型 一对多: 一个部门有很多员工,但一个员工只能从属于一个部门 多对一: 多个员工只能属于一个部门 department 部门表,employee 员工表 egg-sequelize 实现一对多 分类表: 商品表: 分类 1------n 商品 1、model 里面建2张模型,分别是 category.js goods.js 2、catrgory.js 模型代码: modul

  • 这是项目迁移 这是时间表 这样用户就可以迁移了 这是我的项目模型 这是我的时间表模型: 这是我的用户模型 现在,我从项目返回我的查询 这是可以的,但user_id用户在timesheets.user_id我不能得到它的时间表,并得到它 此控制器按时间表中的项目id返回项目和时间表,但时间表中的用户id我不知道如何将其输入系统

  • 我希望通过一条线串拆分一个多多边形(代表一个有岛屿的国家),从而将该县一分为二。 此结果是GeometryCollection对象中的一组多边形。如何将结果分组为两个多多边形对象,每个对象都包含各自一半的多边形? 使现代化 问题:确定分裂形状几何的“左”和“右”侧提供了一个很好的解决方案,其中从结果中的每个多边形中提取一个点,看看当与分裂的LineString结合时,它是否形成顺时针或逆时针线串。