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

使用Pojo作为映射中的键无法找到键Java 8,java,collections,java-8,hashmap,java-stream,Java,Collections,Java 8,Hashmap,Java Stream,尝试在注册表项中使用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<

尝试在注册表项中使用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;
    }

}
}
公共类测试{
publicstaticvoidmain(字符串a[]){`在这里输入代码`
HashMap hm=新的HashMap();
//将键值对添加到hashmap
列表lm=新的ArrayList();
lm.增加(新型号(1,“1”);
lm.增加(新型号(2,“2”);
hm.put(lm.get(0),“1”);
系统输出打印项次(“开始”);
if(hm.containsKey(lm.stream().filter(person->person.name.equals)(“1”)
&&
person.rollNo.equals(1)).findFirst()){
System.out.println(“命中”);
}
}
静态类模型{
私有整数rollNo;
私有字符串名称;
@凌驾
公共布尔等于(对象obj){
模型温度=(模型)obj;
if(modeltemp.name.equals(name)和&modeltemp.rollNo.equals(rollNo)){
返回true;
}
返回super.equals(obj);
}
公共整数getRollNo(){
返回rollNo;
}
public void setRollNo(整数rollNo){
this.rollNo=rollNo;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共模型(整数rollNo,字符串名称){
超级();
this.rollNo=rollNo;
this.name=名称;
}
}
}

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

然后
findFirst
返回一个
可选的
,而不是
模型
。由于
containsKey
from
HashMap
接受
对象作为参数,这将作为方法调用,但显然找不到任何内容

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


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

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

然后
findFirst
返回一个
可选的
,而不是
模型
。由于
containsKey
from
HashMap
接受
对象作为参数,这将作为方法调用,但显然找不到任何内容

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


请注意,如果您的列表中不包含此人(您也可以在此处执行其他操作-由您决定),则会引发异常。

除了非常不清楚之外,您的实际问题是什么?请参阅:您了解HashMap键是如何被搜索的吗?equals和hashcode…通过使用一个可变的密钥,您将自己暴露在讨厌的bug中。帮你自己一个忙,使用不可变键。有关指导,请参阅Josh Bloch的《有效Java》第三版第17项:最小化可变性。除了非常不清楚之外,您的实际问题是什么?请参阅:您了解HashMap键是如何被搜索的吗?equals和hashcode…通过使用一个可变的密钥,您将自己暴露在讨厌的bug中。帮你自己一个忙,使用不可变键。有关指导,请参见Josh Bloch的有效Java第3版中的第17项:最小化可变性。可选的equals和hashcode将委托给非null值,因此如果模型类愿意测试可选的,这仍然可以工作。当然,整个流程。过滤器。。。findfirst非常奇怪,它在缺少hashCode()的情况下失败。@user2023577是的,假设类似的东西已经就位
modelmodelTemp;if(obj instanceof Optional){modeltemp=((可选)obj).get();}else{modeltemp=(Model)obj;}…
但我不知道这是否适合OP的modeltemp。Optional应该始终是一个返回值,而不是一个输入参数。@user2023577嗯。。。它在我们的项目中用作输入,因此“有时”!=“从不”;虽然在内部调用中使用null表示缺少的值更为可取,但我猜是这样,那么谁在检查可选值不是null呢?看,这对输入没有帮助。Optional是来自返回的方法的声明,不应超出该声明。请注意,Optional也不可序列化以强制执行该概念。Optional等于并将hashcode委托给非null值,因此如果模型类愿意测试Optional,这仍然可以工作。当然,整个流程。过滤器。。。findfirst非常奇怪,它在缺少hashCode()的情况下失败。@user2023577是的,假设类似的东西已经就位
modelmodelTemp;if(obj instanceof Optional){modeltemp=((可选)obj).get();}else{modeltemp=(Model)obj;}…
但我不知道这是否适合OP的modeltemp。Optional应该始终是一个返回值,而不是一个输入参数。@user2023577嗯。。。它在我们的项目中用作输入,因此“有时”!=“从不”;虽然在内部调用中使用null表示缺少的值更为可取,但我猜是这样,那么谁在检查可选值不是null呢?看,这对输入没有帮助。Optional是来自返回的方法的声明,不应超出该声明。请注意,Optional也不可序列化以强制执行该概念。
@Override
public int hashCode() {
    return Objects.hash(getRollNo(), getName());
}
  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");
  }