使用Pojo作为映射中的键无法找到键Java 8
尝试在注册表项中使用POJO,但找不到与当前methodolgy匹配的任何问题 我怎样才能解决这个问题使用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<
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
fromHashMap
接受对象作为参数,这将作为方法调用,但显然找不到任何内容
您可以通过以下方式简化此操作(并使其更具可读性):
请注意,如果您的列表中不包含此人(您也可以在这里做其他事情-由您决定),则会引发异常。第一个问题是,您需要实现hashCode
和equals
,从而向模型添加一个方法(类为大写):
然后findFirst
返回一个可选的
,而不是模型
。由于containsKey
fromHashMap
接受对象作为参数,这将作为方法调用,但显然找不到任何内容
您可以通过以下方式简化此操作(并使其更具可读性):
请注意,如果您的列表中不包含此人(您也可以在此处执行其他操作-由您决定),则会引发异常。除了非常不清楚之外,您的实际问题是什么?请参阅:您了解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");
}