我有一个实体列表,我需要使用filter和Map以及必要的键和值来删除其中一些实体。
看起来像那样。有List<Comment> commentsList
和Map<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);
}
但是它返回零值。
答案 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);
}