如何按专辑中的曲目数量过滤此歌曲

Posted

技术标签:

【中文标题】如何按专辑中的曲目数量过滤此歌曲【英文标题】:How to filter this songs by amount tracks in an Album 【发布时间】:2021-10-15 12:52:06 【问题描述】:

我有下一堂课。

public class Track
    private int id;
    private String trackName;
    private String artistName;
    private String albumName;
    private int amountMembers;
    private int duration; //segs
    private String category;
    private int albumYear;
    private boolean isSolist; //1 yes, 0 no 

我的列表中有很多 Track,我想按两个要求过滤曲目:

如果类别等于“摇滚” 如果曲目属于少于 9 首曲目的专辑

首先很简单,我目前在列表中的曲目按“摇滚”类别过滤,但我无法想象如何执行过滤并返回专辑中少于 9 首曲目的功能歌曲。任何解决方案?我正在使用 Java,我可以使用 Streams 还是 Lambdas?重要提示:我的数据库中有一个完整的曲目列表。

【问题讨论】:

提示:您的要求提到了曲目专辑。所以问题是:相册的数据模型是什么样的?或者您只是有一个“数据库”中所有曲目的平面列表?换句话说:也许您应该退后一步,重新设计您的模型,并以专辑为基础?就像例子一样。无论如何,我们可能无法帮助您,因为如前所述:我们不了解所有相关方面。请与我们分享! 嗨!我有你提到的所有曲目的平面列表。 那我强烈建议你至少引入一个 Album 类。因为当您需要订购/比较东西时,您真的希望能够说this.album.equals(that.album)。因为否则,您将进入比较多个字段(如专辑名称、年份等)的业务……如果您想真实的话。当然,这取决于你想去的现实程度。但是想一想:同一年的“同一张”专辑可能有 2、3 个版本也不是太不现实。 我会试试的,谢谢你的时间! 【参考方案1】:

您可以在逻辑中使用 lambda


Predicate<Track> isTrackRock = t -> "rock".equals(t.getCategory());

Predicate<Track> hasAlbumLessThan9Traks = t -> t... // get all album with count of tracks

var listOftrack = new ArrayList<Track>();


var newList  =  listOftrack
                    .stream()
                    .filter(isTrackRock)
                    .filter(hasAlbumLessThan9Traks)
                    .collect(Collectors.toList());

我建议你已经从 db 中过滤以获得更好的性能

【讨论】:

嗯,谢谢,我该如何过滤?我正在使用 mysql 你用什么从数据库中获取数据? hibernate, jdbdTemplate, Spring-data with repositoriy, 在纯 java 上自定义手动选择和连接? 休眠并使用 CrudRepository 从表中获取内容 这将帮助您在 CrudRepository CrudRepository@Query baeldung.com/spring-data-jpa-query 上声明您的方法 谢谢,我会看的!【参考方案2】:

尚未正确测试,但您可以试试这个:

    listOfTracks.stream()
            .filter(track -> "rock".equals(track.getCategory()))
            .filter(track -> listOfTracks.stream()
                    .collect(Collectors.groupingBy(Track::getAlbumName, Collectors.counting())).get(track.getAlbumName()) < 9L)
            .collect(Collectors.toList());

如果它有效并且是您所需要的,您可以尝试为 listOfTracks.stream().collect(Collectors.groupingBy(Track::getCategory, Collectors.counting())) 添加一个变量

【讨论】:

以上是关于如何按专辑中的曲目数量过滤此歌曲的主要内容,如果未能解决你的问题,请参考以下文章

Spotify App API:播放专辑中的特定曲目

如何在 Spotify 上播放专辑中的曲目,以便之后使用 Spotify App Remote SDK for Android 播放专辑的下一首曲目?

林俊杰所有歌曲的列表

是否有用于音乐信息(专辑、艺术家、曲目)的免费数据库或网络服务 API? [关闭]

获取带有 MusicBrainz ID 的专辑曲目列表

Spotify API GET 请求到 JSON