如何使用列表映射过滤流值?

时间:2019-07-05 22:01:25

标签: java lambda java-stream

我有一个实体列表,我需要使用filter和Map以及必要的键和值来删除其中一些实体。

看起来像那样。有List<Comment> commentsListMap<Integer, List<Post>> postsById。评论实体具有方法getByPostId。地图看起来像<Post id, has amount of comments>。 我需要从commentsList中删除与少于3条评论的帖子相关的评论。 我试图这样做:

Stream<E> ofAtLeastComments(Stream<E> comments, Stream<Post> posts, Integer count) {
    Map<Integer, List<Post>> postById = posts
            .collect(Collectors.groupingBy(Post::getId)
            );
    return comments
            .filter(comment -> postById.get(comment.getCommentId()).size() >= count);
}

但是它返回零值。

1 个答案:

答案 0 :(得分:0)

正如JB Nizet指出的那样,该代码似乎使帖子ID和注释ID混乱:

Stream<E> ofAtLeastComments(Stream<E> comments, Stream<Post> posts, Integer count) {
    Map<Integer, List<Post>> posts = posts.collect(Collectors.groupingBy(Post::getId));
    return comments.filter(comment -> posts.get(comment.getPostId()).size() >= count);
    //                                                     ^^^^
}

但是方法名称听起来更像您这样:

<E extends Comment> Stream<Post> ofAtLeastComments(Stream<E> comments, Stream<Post> posts, Integer count) {
    // Number of comments per post ID 
    Map<Integer, Long> commentCounts = comments
            .collect(Collectors.groupingBy(Comment::getPostId, Collectors.counting()));
    return posts.filter(post -> commentCounts.getOrDefault(post.getId(), 0L) >= count);
}