我有Set
个具有现有值的对象,并获得了一个新的Set
值作为更新。如果新的Set
确实包含旧对象,那么我什么也不做,如果新的Set
包含新对象,那么我要发送创建更新,并且新的Set
不包含现有对象对象,然后我要发送删除更新。
对象有两个字段:
private PreferenceType preferenceType;
private String preferenceValue;
当前,我正在将现有Set对象与新Set对象进行比较,如果我在新集合中找不到任何现有对象,则发送删除更新。
private void sendDeletePreferenceMessage(Set<AccountPreference> existingAccountPreferences, Set<AccountPreference> accountPreferencesFromRequest) {
int counter = 0;
for(AccountPreference accountPreference : existingAccountPreferences) {
for(AccountPreference accountPreference1: accountPreferencesFromRequest) {
if(accountPreference.getPreferenceType().equals(accountPreference1.getPreferenceType()) &&
accountPreference.getPreferenceValue().equals(accountPreference1.getPreferenceValue()))
counter++;
}
if(counter == 0) {
accPrefDeleteSender.send(accountPreference);
}
}
}
还将新对象集与现有对象集进行比较,以查找要作为创建更新发送的新更新
private void sendCreatePreferenceMessage(Set<AccountPreference> accountPreferencesFromRequest, Set<AccountPreference> existingAccountPreferences) {
int counter = 0;
for(AccountPreference accountPreference : accountPreferencesFromRequest) {
for(AccountPreference accountPreference1: existingAccountPreferences) {
if(accountPreference.getPreferenceType().equals(accountPreference1.getPreferenceType()) &&
accountPreference.getPreferenceValue().equals(accountPreference1.getPreferenceValue()))
counter++;
}
if(counter == 0) {
accPrefCreateSender.send(accountPreference);
}
}
}
这很好用,但我相信可以用更好的方法简化它。任何建议做得更好!
答案 0 :(得分:0)
您正在使用两个AccountPreference
对象:一个带有id字段,另一个没有id。我不知道是否可以不使用接口或抽象类。不过,根据您的评论,在我看来,您对如何覆盖Object.equals
方法感到困惑,因此,我举一个例子:
class MyObjectWithId {
private long id;
private String someField;
public String getSomeField() {
return someField;
}
@Override
public boolean equals(Object other){
if (this == other) return true;
if (other == null || !other.getClass().isInstance(MyObject.class)) return false;
MyObject myObject = (MyObject) other;
return this.getSomeField().equals(myObject.getSomeField());
}
}
class MyObject {
private String someField;
public String getSomeField() {
return someField;
}
@Override
public boolean equals(Object other){
if (this == other) return true;
if (other == null || !other.getClass().isInstance(MyObjectWithId.class)) return false;
MyObjectWithId myObjectWithId = (MyObjectWithId) other;
return this.getSomeField().equals(myObjectWithId.getSomeField());
}
}
如您所见,您可以询问两种不同类型的对象是否相等(在这种情况下,不需要覆盖{{1} }。
现在,您应该可以进行剩下的工作了(关于您最初关于两个Set的问题)
答案 1 :(得分:0)
Set具有方法boolean contains(Object o)
。
您不需要两个for
循环,只需遍历一个Set
并检查是否另外一个Set
contains()
对象!
您还需要在POJO中覆盖boolean equals(Object o)
!
class MyObject {
private PreferenceType preferenceType;
private String preferenceValue;
@Override
public boolean equals(Object o){
if (this == o)
return true;
if (o == null || o.getClass()o.getClass() != getClass())
return false;
if(this.getPreferenceType().equals(o.getPreferenceType()) && this.getPreferenceValue().equals(o.getPreferenceValue()))
return true;
return false;
}
}
}