Как сравнить некоторое другое значение некоторого поля в списке массивов с другим списком и вернуть разницу в java spring?

#java #arrays #spring #spring-boot

#java #массивы #spring #spring-boot

Вопрос:

Привет, чего я пытаюсь достичь, так это получить разное значение некоторых свойств в двух списках, которые имеют некоторые одинаковые свойства, но не все одинаковы. я хочу получить другое значение и вернуть его как значение, которое уже изменилось. вот что у меня есть :

у меня есть первый DTO, который отправляется из интерфейса ShipmentAddressGroupingDtDto.java это выглядело примерно так :

 @Data
public class ShipmentAddressGroupingDtDto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    public String address;

    public Boolean isActive;

    public Long partnerShipmentId;
    
}
  

и вот мой DTO, который я получил перед другим API, PartnerShipmentDto.java :

 @Data
public class PartnerShipmentDto {

    public Long id;

    public String partnerShipmentCode;

    public String address;

    public String phoneNumber;

    public String region;

    public String subPartnerName;

    public String subPartnerAddress;

    public Integer o<

    public String typeShipment;

    public Boolean allowBigVehicle;

    public Boolean isActive;
    
}
  

я хочу сравнить эти два объекта, используя два свойства, первое поле isActive и второй адрес, если эти поля отличаются, которые изменены на удаленной стороне (другой API), я хочу уведомить пользователя, что значение изменилось на новое значение, и в будущем я хочу сравнить другие свойства с тем же именем, а не только эти два свойства (isActive и address).

мне нужно сравнить два списка, первый shipmentAddressGroupingDto и второй partnerShipmentDto.

примечания: в PartnerShipmentDto .getId ссылается на ShipmentAddressGroupingDtDto .getPartnerShipmentId в качестве ссылки

Вот что я делаю, в моем service.java :

 //here is how i got the data from front end 
        ShipmentAddressGroupingDto shipmentAddressGroupingDto = request.getObject();
        List<ShipmentAddressGroupingDtDto> shipmentAddressGroupingDtDto = shipmentAddressGroupingDto.getShipmentAddressGroupingDtDto();

// here is how i got the data from remote API
        List<PartnerShipmentDto> partnerShipmentDto = webClient.post().uri(url).body(Mono.just(partnerShipmentIds),
            PartnerShipmentDto.class).retrieve().bodyToMono(new ParameterizedTypeReference<List<PartnerShipmentDto>>() {}).block();


    for(int i=0; i < shipmentAddressGroupingDtDto.size(); i  ) {
        ShipmentAddressGroupingDtDto s = shipmentAddressGroupingDtDto.get(i);
        for(int a=0; a < partnerShipmentDto.size(); a  ) {
            if(s.getPartnerShipmentId().equals(partnerShipmentDto.get(a).getId())){
                Boolean isActiveResult = s.getIsActive().equals(partnerShipmentDto.get(a).getIsActive());
                Boolean addressResult = s.getAddress().equals(partnerShipmentDto.get(a).getAddress());

                if(!isActiveResult){
                    throw new ResourceAlreadyChange("Active already change");
                } else if(!addressResult) {
                    throw new ResourceAlreadyChange("Address already change");
                }
            }
        }
    }
  

Как я могу достичь этого результата без цикла to many for и добавления if для каждого поля? есть ли в Java какая-то функция, возможно, использующая лямбда-выражение или что-то еще для достижения этого? может быть, использовать одно или два измерения для цикла нормально, но не использовать условие if, основанное на свойствах, может ли java найти некоторые свойства с одинаковыми именами и сравнить их и получить значение, которое имеет разницу (с левой или правой стороны нормально) между ними? таким образом, мне не нужно добавлять условие if для каждого свойства, которое я должен сравнить, потому что у них уже есть одинаковые имена свойств. пожалуйста, помогите мне с примером

является ли мой service.java достаточно ясно? я улучшу свой вопрос, если мне не совсем ясно

Комментарии:

1. Покажите нам, что вы пробовали до сих пор, и более четко, чего вы хотите в результате (прямо сейчас это не ясно)

2. о, извините, я только что обновил свой ответ @JAsgarov можете ли вы помочь мне повысить мой вопрос, чтобы он не был минус? просто, если вы не возражаете, ха-ха

Ответ №1:

Моей рекомендацией было бы использовать Java streams, чтобы сделать его немного более читаемым. В противном случае на ум не приходит особых улучшений.

Надеюсь, это все еще помогает, хотя 🙂

 shipmentAddressGroupingDtDto.stream().forEach(shipmentAdressGroupingDto -> {
  partnerShipmentDto.stream().forEach(partnerShipmentDto -> {
      if(partnerShipmentDto.getId().equals(shipmentAdressGroupingDto.getId())){
          Boolean isActiveResult = s.getIsActive().equals(partnerShipmentDto.get(a).getIsActive());
          Boolean addressResult = s.getAddress().equals(partnerShipmentDto.get(a).getAddress());

          if(!isActiveResult){
             throw new ResourceAlreadyChange("Active already change");
          }else if(!addressResult){
             throw new ResourceAlreadyChange("Address already change");
          }
      }
   }
}
  

Комментарии:

1. я вижу .. очень хороший POV, спасибо. все еще ждите другого решения, которое, возможно, имеет более простой синтаксис для сравнения