Как отфильтровать значения потоков с помощью Map of Lists? - PullRequest
1 голос
/ 06 июля 2019

У меня есть список сущностей, и мне нужно удалить некоторые из них, используя 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);
}

Но он возвращает нулевое значение.

1 Ответ

0 голосов
/ 06 июля 2019

Как отметил JB Nizet, код, похоже, сбивает с толку идентификаторы постов и комментариев:

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