#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, спасибо. все еще ждите другого решения, которое, возможно, имеет более простой синтаксис для сравнения