Этот тип проверки, который вы выполняете, лучше с помощью императивного подхода, тем не менее, мы можем использовать лямбды, где это уместно.
Во-первых, я бы выделил повторяющиеся условия для локального предиката с использованием signum
, что также было предложено @Thomas Kläger в статье, поскольку в данном конкретном случае это более уместно, чем intValue
.
Predicate<BigDecimal> criteria = b -> b != null && b.signum() < 0;
Тогда ваш императивный подход будет выглядеть так:
for (GlobalPricingRequest globalPricingRequest : globalPricingRequests) {
isValidOrElseThrowBadRequestException(globalPricingRequest.getFeePerTransact(), criteria);
for (EventTypePricingMapping eventTypePricingMapping : globalPricingRequest.getEventTypePricingList()) {
isValidOrElseThrowBadRequestException(eventTypePricingMapping.getFeePerRevenue(), criteria);
}
}
Где isValidOrElseThrow
определяется как:
public static void isValidOrElseThrowBadRequestException(BigDecimal data, Predicate<BigDecimal> criteria) throws Exception { // change the exception to the specific one you're using
if(criteria.test(data)) throw ExceptionHelper.badRequest("Fee Per Transaction can't be less than zero");
}
С помощью нескольких отрывков, мы можем сделать код более читабельным.