繁体   English   中英

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

[英]How to filter stream values using Map of Lists?

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

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

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

但是它返回零值。

正如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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM