java - 根据标准将列表分成两个列表的最佳方法是什么

标签 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
});

最佳答案

您正在寻找的是 Collectors.partitioningBy,它将为您提供一个 Map,其中键是一个 Boolean;因此你可以这样做:

result.get(true/false) 

获取每个单独的列表。由于您似乎对流很熟悉,所以我不会展示示例,您很可能会弄明白

关于java - 根据标准将列表分成两个列表的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52396164/

相关文章:

java-8 - 我应该使用 Stream API 进行简单迭代吗?

java - 使用子对象列表更新主对象列表

java - 如何让菜单在while循环中重新出现

Java 继承在反射中不被识别

Java正则表达式截断时间戳值

java - 使用 Streams API 根据字段值求和对象

ssl - JDK 1.8 是否支持具有 4096 位大小的 Diffie-Hellman (DH) key 的密码套件

Java并发尝试加锁

java - 为泛型类型参数传入一个数组

Java 8 - 三元运算符返回函数不编译