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

问题描述 投票:0回答:2

我还有下一堂课。

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?重要提示:我的数据库中有一个简单的曲目列表。

java lambda java-stream
2个回答
0
投票

您可以将 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());

我建议您已经从数据库中过滤以获得更好的性能


0
投票

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

    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())) 添加一个变量

© www.soinside.com 2019 - 2024. All rights reserved.