如何在不复制整个对象值的情况下覆盖对象中单个字段的值

How to override a value of a single field in an object without copying the entire objects values

我想替换一个objects of objects深处的某个字段。

我需要替换的值在 Voucher 对象中,它位于

CarBookingRequest>CarSegment>RentalPayentPref>Voucher>类型

目前,这是我的代码

//generate new voucher type for SV
            String currencyCode = originalRequest.getCarSegment().getCarTotalPrice().getCurrencyCode();
            String amount = originalRequest.getCarSegment().getCarTotalPrice().getAmount();
            String carTotalPrice = currencyCode + amount;

            //get Old Voucher values and re-assign type to carTotalPrice
            Voucher voucher = new Voucher();
            voucher.setBillingNumber(originalRequest.getCarSegment().getRentalPaymentPref().getVoucher().getBillingNumber());
            voucher.setFormat(originalRequest.getCarSegment().getRentalPaymentPref().getVoucher().getFormat());
            voucher.setType(carTotalPrice);

            RentalPaymentPref rentalPaymentPref = new RentalPaymentPref();
            rentalPaymentPref.setVoucher(voucher);

            CarSegment carSegment = new CarSegment();
            carSegment.setRentalPaymentPref(rentalPaymentPref);

            originalRequest.setCarSegment(carSegment);

如何在不从所有其他对象中删除现有值的情况下执行此操作,因为毕竟,凭证上方的对象有自己的值,我不需要更改但需要保留这些值。由于此值已分配给在另一个代码上引用的变量。 class 在下面的代码中被引用得很近。

CarBookingRequest newRequesst = originalRequestBody; 

我尝试手动实例化所有高级 classes 并只是覆盖我需要的值,但它也从其他不需要更改的参数中删除了现有值。

这是我的示例模型 class:

CarbookingRequest.class

 public class CarBookingRequest {
           
        private CarSegment carSegment;
        private List<Remark> remarks;
        private String test;
    
    }

CarSegment.class

public class CarSegment {
       
    private String billingNumber;
    private RentalPayentPref rental;
    private String test;

}

RentalPayentPref.class

public class RentalPayentPref {
       
    private Voucher Voucher;
    private String test;

}

Voucher.class

public class Voucher {
       
    private String amount;
    private String type;

}

刚刚意识到我可以用这一行代码做到这一点。

Optional.ofNullable(originalRequest)
                    .map(CarBookingRequest::getCarSegment)
                    .map(CarSegment::getRentalPaymentPref)
                    .map(RentalPaymentPref::getVoucher)
                    .ifPresent(voucher -> voucher.setType(carTotalPrice));

我的问题现在已经解决了。尽管我在上面标记为答案的另一个答案很可能是更好和更短的版本,因为已经不需要地图并且现有值仍然保留。

当您可以从 getter 方法中获取现有对象时,为什么要创建新对象。您仅在回答中提供了 getter 方法,而在问题中未提供。您可以按如下方式使用它们:

originalRequest
  .getCarSegment()
  .getRentalPaymentPref()
  .getVoucher()
  .setType(newValue);