Как найти различия между двумя коллекциями - PullRequest
0 голосов
/ 11 марта 2020

У меня есть следующие DTO:

@Data
public class PersonDTO implements Diffable<PersonDTO> {

    private String id;
    private String firstName;
    private String lastName;
    private List<AddressDTO> addresses;

    @Override
    public DiffResult diff(PersonDTO personDTO) {
        return new DiffBuilder(this, personDTO, SHORT_PREFIX_STYLE)
                .append("id", this.id, personDTO.getId())
                .append("firstName", this.firstName, personDTO.getFirstName())
                .append("lastName", this.lastName, personDTO.getLastName())
                .append("addresses", addresses, personDTO.getAddresses())
                .build();
    }
}

@Data
public class AddressDTO implements Diffable<AddressDTO> {

    private String id;
    private String personId;
    private String addressType;
    private String street;
    private String houseNumber;
    private String postalCode;
    private String city;
    private String countryId;

    @Override
    public DiffResult diff(AddressDTO addressDTO) {
        return new DiffBuilder(this, addressDTO, SHORT_PREFIX_STYLE)
                .append("id", this.id, addressDTO.getId())
                .append("personId", this.personId, addressDTO.getPersonId())
                .append("addressType", this.addressType, addressDTO.getAddressType())
                .append("street", this.street, addressDTO.getStreet())
                .append("houseNumber", this.houseNumber, addressDTO.getHouseNumber())
                .append("postalCode", this.postalCode, addressDTO.getPostalCode())
                .append("city", this.city, addressDTO.getCity())
                .append("countryId", this.countryId, addressDTO.getCountryId())
                .build();
    }
}

Моя главная цель - найти различия между двумя похожими объектами человека. В настоящее время я пытался использовать Diffable интерфейс из apache commons, который идеально подходит для объекта. Посоветуйте, пожалуйста, как обращаться с коллекциями, если размер каждой коллекции может быть разным. Например, несколько адресов было удалено, несколько было добавлено, а несколько обновлено. Пожалуйста, см. Пример ниже:

enter image description here

Возможно, есть еще одна библиотека, которая помогает достичь аналогичных целей, пожалуйста, совет

1 Ответ

0 голосов
/ 11 марта 2020

источник может быть вашим первым объектом

цель может быть вашим вторым объектом

Iterator targetIt = target.iterator();
for (Object obj:source)
  if (!obj.equals(targetIt.next())
    // Element has changed
...