Java如何过滤所属专辑曲目少于9首的摇滚类Track实例
解决方案
完全可以通过Java Stream实现,核心逻辑是先统计所有专辑的总曲目数,再基于统计结果做二次过滤即可,具体实现如下:
前置准备
首先为Track类的私有属性添加对应的Getter方法,示例需要用到getCategory()、getAlbumName()两个方法,请提前实现。
实现方式1(推荐,逻辑清晰易维护)
分两步操作,先统计全量专辑的曲目总数,再做条件过滤:
- 统计所有专辑对应的总曲目数,生成映射Map:
// allTracks为你数据库查询得到的原始扁平化Track列表 Map<String, Long> albumTrackCountMap = allTracks.stream() .collect(Collectors.groupingBy(Track::getAlbumName, Collectors.counting()));
- 按两个条件筛选符合要求的Track:
List<Track> result = allTracks.stream() // 筛选category为rock的曲目 .filter(track -> "rock".equals(track.getCategory())) // 筛选所属专辑总曲目数小于9的曲目 .filter(track -> albumTrackCountMap.getOrDefault(track.getAlbumName(), 0L) < 9) .collect(Collectors.toList());
注意:如果你已经提前完成了category为rock的筛选,统计专辑总数时必须使用原始的全量Track列表,不能使用筛选后的rock列表,否则统计的是专辑内摇滚曲目的数量,不是专辑总曲目数,会不符合需求。
实现方式2(单Stream链式写法)
也可以通过一次Stream链式操作完成,先按专辑分组过滤再扁平化结果:
List<Track> result = allTracks.stream() // 按专辑名分组 .collect(Collectors.groupingBy(Track::getAlbumName)) .entrySet().stream() // 过滤总曲目数小于9的专辑 .filter(albumEntry -> albumEntry.getValue().size() < 9) // 取出符合条件专辑的所有曲目 .flatMap(albumEntry -> albumEntry.getValue().stream()) // 筛选category为rock的曲目 .filter(track -> "rock".equals(track.getCategory())) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者Julian Gimenez
相关产品推荐
相关产品推荐

