首页 > 解决方案 > 检查列表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;

    }

如您所见,我得到了我想要关注的用户的关注者,并尝试检查其是否关注。但我做不到。

任何帮助,将不胜感激

标签: javaspring

解决方案


您所构建的效率非常低:

  • 转到数据库并获取给定用户的所有关注者。
  • 如果您要添加的人已经存在,请检查这些。
  • 如果没有,添加它。
  • 如果是,请不要执行任何操作或显示错误。

由于这种低效率,失败的鲸鱼在你不久的将来。

有一个简单得多的方法。只是..添加它!根本不要做任何检查。

您的数据库应配置为不允许拥有相同的用户/关注者对,因此,如果您在该用户已经拥有该关注者时尝试拉该特技,则数据库将拒绝并抛出异常,表明存在违反数据库约束的异常。这是你呈现任何你喜欢的错误的提示。

请注意,在谈论多核架构时,“检查​​是否允许 X,如果允许,则执行 X”从根本上被破坏了。您忘记了什么:如果用户“双击”“添加关注者”链接怎么办?然后同时启动 2 个请求。他们都检查 X 是否已经是追随者(他们不是),然后他们都将 X 添加为追随者(现在 X 是您不想要的双重追随者)。

一般来说,如果涉及数据库,它在数据一致性和事务支持方面会更好,所以使用最好的工具来完成这项工作:数据库约束。


推荐阅读