网站上有一些类似的问题,但他们使用的地图可能会改变类型。我不太清楚这段代码在做什么,我希望有人能帮助我直截了当。
该代码取自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;
答案 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;
}
}