[英]How to filter stream values using Map of Lists?
我有一个实体列表,我需要使用filter和Map以及必要的键和值来删除其中的一些实体。
看起来像那样。 有一个List<Comment> commentsList
和Map<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.