如何在不复制整个对象值的情况下覆盖对象中单个字段的值
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);
我想替换一个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);