我有一个对象列表,我想根据一个字段的值将此列表分为两个列表。这是我使用Stream.filter()
的方法:
public void setMovieMedia(List<MovieMediaResponse> movieMedias) {
// fill the first list
this.setPhotos(movieMedias
.stream()
.filter(movieMedia -> movieMedia.getType().equals(MediaType.PHOTO))
.collect(Collectors.toList()));
// fill the second list
this.setVideos(movieMedias
.stream()
.filter(movieMedia -> movieMedia.getType().equals(MediaType.VIDEO))
.collect(Collectors.toList()));
}
但是,通过这种方法,我想我在列表中循环了两次。有没有一种方法可以实现相同的目的而又无需遍历列表两次?
PS:我知道可以通过使用List.forEach()
来实现此目标,如以下示例所示,但我想避免使用此方法:
List<MovieMediaResponse> movieMedias = ...;
movieMedias.forEach(m -> {
if (m.getType().equals(MediaType.PHOTO))
// append to list1
else if (m.getType().equals(MediaType.VIDEO))
// append to list2
});
答案 0 :(得分:3)
您正在寻找的是Collectors.partitioningBy
,它将为您带来Map
,其中钥匙是Boolean
;这样就可以做到:
result.get(true/false)
获取每个单独的列表。由于您似乎了解流的处理方式,因此我不会显示示例,很可能可以弄清楚