根据条件将列表分为两个列表的最佳方法是什么

时间:2018-09-19 00:08:45

标签: java java-8

我有一个对象列表,我想根据一个字段的值将此列表分为两个列表。这是我使用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
});

1 个答案:

答案 0 :(得分:3)

您正在寻找的是Collectors.partitioningBy,它将为您带来Map,其中钥匙是Boolean;这样就可以做到:

result.get(true/false) 

获取每个单独的列表。由于您似乎了解流的处理方式,因此我不会显示示例,很可能可以弄清楚