Сбор Java и R не может быть преобразован в Set <Post> - PullRequest
0 голосов
/ 25 мая 2019

На сайте есть несколько похожих вопросов, но они использовали карту, которая изменила бы тип.Я не совсем понимаю, что я делаю неправильно в этом коде, я надеюсь, что кто-то может исправить меня.

Код взят из JPARepository, следовательно, findAll (), но это можно игнорировать

Edit - возврат forEach не сработает, но я просто обеспокоен ошибкой в ​​Rне конвертируемыйДобавлена ​​подпись для метода setPosts

boolean canViewHidden = hasAuthority(Permissions.Post.VIEWHIDDEN);
        //findAll should return List<Category>
        return categoryRepository.findAll().forEach(
                //each category has a Set<Post> accessible by getPosts
                category -> category.getPosts().stream()
                    //filtering out the posts that we can't view
                    .filter(post -> canViewHidden || !post.isHidden())

                     //my understanding is filter results in a Stream of Post
                     //however category::setPosts here gives the R is not convertible to Set<Post>                      
                    .collect(Collectors.collectingAndThen(Collectors.toSet(), category::setPosts))
        );

setPosts из Post.java

public void setPosts(Set<Post> posts) {
    this.posts = posts;
}

//spring annotation can be ignored
@OneToMany(mappedBy = "category")
private Set<Post> posts;

Ответы [ 2 ]

3 голосов
/ 25 мая 2019

collectingAndThen ожидает, что второй аргумент будет Function, чтобы позволить пользователю применить последнее преобразование к собранному Collection.Однако category::setPosts не преобразует коллекцию, а просто принимает ее, но возвращает void.Это не сработает.

Если вы просто хотите, для каждой категории, заменить список сообщений подмножеством, описанным вашей потоковой операцией, вы можете просто сделать следующее:

categoryRepository.findAll().forEach(category -> {
    Set<Post> posts = category.getPosts().stream()
        .filter(post -> canViewHidden || !post.isHidden())
        .collect(Collectors.toSet());
    category.setPosts(posts);
});
1 голос
/ 25 мая 2019

Я не был уверен, что такое Post, поэтому я использовал вместо него String и отфильтровал его по длине String 2. Вы должны иметь возможность адаптировать его для использования любого класса с соответствующим фильтром.

Вот то, что я придумал. Вы сказали, что хотите вернуть список, поэтому я сделал это вместо набора. Обратите внимание, что вам не нужно делать второе преобразование, поэтому collectingAndThen не требуется.

      List<Category> categoryRepository = new ArrayList<>();

      categoryRepository.add(
            new Category(Set.of("A", "B", "C", "DE", "FG", "ABC")));
      categoryRepository.add(new Category(
            Set.of("AAAA", "BBBB", "CC", "DDDE", "FFFG", "ABC", "12")));
      categoryRepository.add(
            new Category(Set.of("ARS", "AB", "CCC", "RE", "GG", "ABC")));

      List<String> list = categoryRepository.stream().flatMap(
            a -> a.getPosts().stream()).filter(a -> a.length() == 2).collect(
                  Collectors.toList());
      System.out.println(list);
   }

}

class Category {
   private Set<String> posts;

   public Category(Set<String> posts) {
      this.posts = posts;
   }

   public Set<String> getPosts() {
      return posts;
   }
}
  • Список преобразуется в поток () категории
  • Затем каждая категория извлекает Set с помощью getPosts () и направляется в общий поток строк (это будут для вас сообщения).
  • Затем каждая строка (сообщение) фильтруется и помещается в список или набор Ваш выбор и вернулся.
...