Eu tenho dois DTO objetos como seguir, por favor, note que eu estou usando Lombok ao código evitar clichê.
dtoa
import lombok.Data;
import java.util.List;
@Data
public class DtoA {
private String name;
private String number;
private List<String> aList;
}
DtoB
import lombok.Data;
import java.util.List;
@Data
public class DtoB {
private String name;
private String phone;
private List<String> bList;
}
Eu quero comparar campos específicos de ambos os objetos para que eu tenha criado um tipo adaptador de objeto como seguir
DtoAdapter
import lombok.Data;
import java.util.List;
@Data
public class DtoAdapter {
private String nameText;
private List<String> xList;
}
A seguir é a minha classe de teste com o método principal, onde eu estou tentando fazer a comparação Essa comparação está falhando por causa de aList e bList contém cadeias em ordens diferentes. Eu quero comparar o conteúdo da lista sem se preocupar com a sua ordem.
Teste
import junit.framework.Assert;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
DtoA a = new DtoA();
List<String> aList = new ArrayList<>();
aList.add("x"); aList.add("y"); aList.add("z");
a.setName("abc"); a.setNumber("123"); a.setAList(aList);
DtoB b = new DtoB();
List<String> bList = new ArrayList<>();
bList.add("z"); bList.add("x"); bList.add("y");
b.setName("abc"); b.setPhone("123"); b.setBList(bList);
DtoAdapter a1 = new DtoAdapter();
a1.setNameText(a.getName()); a1.setXList(a.getAList());
DtoAdapter b1 = new DtoAdapter();
b1.setNameText(b.getName()); b1.setXList(b.getBList());
// comparision failing because of lists contains string in different orders
Assert.assertEquals(a1, b1);
}
}
Nota: Eu tentei escrever compareTo (através da implementação de interface comparável em classe DtoAdapter) Mas eu não podia comparação gravação de duas listas com o método compareTo como seguir
DtoAdapter com a interface comparável
import lombok.Data;
import java.util.List;
@Data
public class DtoAdapter implements Comparable<DtoAdapter>{
private String nameText;
private List<String> xList;
@Override
public int compareTo(DtoAdapter o) {
return this.getNameText().compareTo(o.getNameText());
// how to compare this.getXList() and o.getXList() with compareTo?
}
}
O que você está olhando para a frente para não está estendendo uma Comparable
, mas uma anulado equals
implementação para a classe (junto com hashcode
, claro).
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DtoAdapter that = (DtoAdapter) o;
// following line of code specifically
return Objects.equals(nameText, that.nameText) &&
that.getXList().containsAll(xList) && xList.containsAll(that.getXList());
}
Além disso a partir da documentação de Comparable
, a interface é usado principalmente para elementos de ordenação e não para comparação de igualdade:
Esta interface impõe uma ordenação total sobre os objetos de cada classe que implementa-lo. Esta ordenação é referido como a classe é ordenação natural, e da classe
compareTo
método é referido como o seu método de comparação naturais .