Java collectionAndThen R不能转换为Set <post>

时间:2019-05-25 15:34:32

标签: java-8 java-stream

网站上有一些类似的问题,但他们使用的地图可能会改变类型。我不太清楚这段代码在做什么,我希望有人能帮助我直截了当。

该代码取自JPARepository,因此使用findAll(),但可以忽略

编辑-返回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))
        );
Post.java中的

setPosts方法

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

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

2 个答案:

答案 0 :(得分:3)

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 :(得分:1)

我不确定Post是什么,所以我改用String并按String长度2进行过滤。您应该能够使其适应使用任何具有适当过滤器的Class。

这是我想出的。您说您想返回一个列表,所以我这样做而不是设定。请注意,您不需要进行第二次转换,因此不需要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;
   }
}
  • 列表被转换为Category的stream()
  • 然后,每个类别都通过getPosts()检索Set,并将其flatMapped到常见的Strings流(这些是适合您的Posts)中。
  • 然后将每个字符串(帖子)过滤并放置在列表或集合中 选择并返回。