como comparar dois objetos, cada uma contendo tipo primitivo e coleção de objetos em java?

praxnet:

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?
    }
}
também:

O que você está olhando para a frente para não está estendendo uma Comparable, mas uma anulado equalsimplementaçã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 compareTométodo é referido como o seu método de comparação naturais .

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=312165&siteId=1
Recomendado
Clasificación