java - 检查列表Java Stream中是否存在对象
问题描述
我有 2 个实体。其中一个是用户,另一个是追随者。我正在尝试制作一个像 Twitter 这样的追随者系统。用户可以关注另一个用户,但是,我想检查用户是否关注,不要再这样做了。
这是我的追随者实体:
@Entity
public class Followers {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="from_user_fk")
@JsonIgnore
private User from;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="to_user_fk")
@JsonIgnoreProperties({ "password", "balance","id","mail" })
private User to;
public Followers() {};
public Followers(User from, User to) {
this.from = from;
this.to = to;
}
public User getFrom() {
return from;
}
public void setFrom(User from) {
this.from = from;
}
public User getTo() {
return to;
}
public void setTo(User to) {
this.to = to;
}
}
这是服务类:
public ResponseEntity<?> followUser(String username, User user) {
User byUsername = getByUsername(username);
List<Followers> followers1 = byUsername.getFollowers();
List<Followers> collect = followers1.stream().filter(p -> p.getTo().getId().equals(user.getId())).collect(Collectors.toList());
if(followers1.size()>0){
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("e");
}
Followers followers = new Followers();
followers.setFrom(user);
followers.setTo(byUsername);
followersRepository.save(followers);
return ResponseEntity.ok(new GenericResponse("Followed"));
}
public List<Followers> getUserFollowers(String username) {
User byUsername = getByUsername(username);
List<Followers> followers = byUsername.getFollowers();
return followers;
}
如您所见,我得到了我想要关注的用户的关注者,并尝试检查其是否关注。但我做不到。
任何帮助,将不胜感激
解决方案
您所构建的效率非常低:
- 转到数据库并获取给定用户的所有关注者。
- 如果您要添加的人已经存在,请检查这些。
- 如果没有,添加它。
- 如果是,请不要执行任何操作或显示错误。
由于这种低效率,失败的鲸鱼在你不久的将来。
有一个简单得多的方法。只是..添加它!根本不要做任何检查。
您的数据库应配置为不允许拥有相同的用户/关注者对,因此,如果您在该用户已经拥有该关注者时尝试拉该特技,则数据库将拒绝并抛出异常,表明存在违反数据库约束的异常。这是你呈现任何你喜欢的错误的提示。
请注意,在谈论多核架构时,“检查是否允许 X,如果允许,则执行 X”从根本上被破坏了。您忘记了什么:如果用户“双击”“添加关注者”链接怎么办?然后同时启动 2 个请求。他们都检查 X 是否已经是追随者(他们不是),然后他们都将 X 添加为追随者(现在 X 是您不想要的双重追随者)。
一般来说,如果涉及数据库,它在数据一致性和事务支持方面会更好,所以使用最好的工具来完成这项工作:数据库约束。
推荐阅读
- adonis.js - Adonis:如何为已存在的列添加索引?
- javascript - 使用“广泛匹配”样式过滤方法基于 Google Apps 脚本中的另一个数组过滤数组
- javascript - 倒计时到 00:00 时重新加载页面
- python - Python 在 Windows CMD 中没有名为“requests_html”的模块
- macos - Mac MySql 上的 XAMPP 访问被拒绝?
- php - Woocommerce - 向整个购物车添加附加费,特定类别除外
- matlab - 如何在Windows系统的MATLAB中停止由系统函数启动的进程?
- c++ - 构造函数模板可以使用构造函数委托吗?
- sql-server - 如何在 SQL Server 中使用不同的有效日期获取已售商品的详细信息
- android - 从 Kotlin Native 访问 Android Keystore (Biometrics)