代码之家  ›  专栏  ›  技术社区  ›  fawad

使用Pojo作为映射中的键无法找到键Java 8

  •  0
  • fawad  · 技术社区  · 7 年前

    尝试在键中使用POJO,但找不到与当前methodolgy匹配的任何问题 我如何解决这个问题?

    public class test {
      public static void main(String a[]){`enter code here`
        HashMap<model, String> hm = new HashMap<model, String>();
        //add key-value pair to hashmap
        List<model> lm=new ArrayList<>();
       lm.add(new model(1,"1"));
       lm.add(new model(2,"2"));
       hm.put(lm.get(0), "1");
        System.out.println("Start");
    
        if (hm.containsKey(lm.stream().filter(person->person.name.equals("1")
                &&
                person.rollNo.equals(1)).findFirst())) {
            System.out.println("hit");
        }
    
    }
    static class  model{
        private Integer rollNo;
        private String name;
    
        @Override
        public boolean equals(Object obj) {
        model   modeltemp= (model)obj;
        if (modeltemp.name.equals(name)&& modeltemp.rollNo.equals(rollNo)) {
            return true;
        }
            return super.equals(obj);
        }
        public Integer getRollNo() {
            return rollNo;
        }
        public void setRollNo(Integer rollNo) {
            this.rollNo = rollNo;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public model(Integer rollNo, String name) {
            super();
            this.rollNo = rollNo;
            this.name = name;
        }
    
    }
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Eugene    7 年前

    第一个问题是您需要实现 hashCode equals ,从而将方法添加到 Model (类为大写):

    @Override
    public int hashCode() {
        return Objects.hash(getRollNo(), getName());
    }
    

    然后 findFirst 返回 Optional<Model> ,不是 模型 自从 containsKey 从…起 HashMap 接受 Object 作为一个参数,这将作为一个方法调用,但显然什么也找不到。

    您可以通过以下方式简化此操作(并使其更具可读性):

      Model m = list.stream()
                .filter(p -> p.name.equals("1"))
                .filter(p -> p.rollNo.equals(1))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("Key not found"));
    
      if (hm.containsKey(m)) {
            System.out.println("hit");
      }
    

    请注意,如果您的列表中不包含此人,这会引发一个异常(您也可以在这里做其他事情-由您决定)