代码之家  ›  专栏  ›  技术社区  ›  Ayoub k

根据一个标准将一个列表分为两个列表的最佳方法是什么[重复]

  •  1
  • Ayoub k  · 技术社区  · 6 年前

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

    但是,使用这种方法,我想我已经循环浏览了两次列表。有没有一种方法可以在不重复列表两次的情况下实现相同的事情?

    我知道我可以通过使用 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 回复  |  直到 6 年前
        1
  •  3
  •   Eugene    6 年前

    你要找的是 Collectors.partitioningBy 那会给你一个 Map 其中密钥是 Boolean ;这样就可以:

    result.get(true/false) 
    

    获取每个单独的列表。既然你似乎知道如何绕过溪流,我不会举一个例子,你很可能会想出办法。