Java中的一些方法或现有设计模式,用于防止发生许多if / else条件,从而导致参数检查的cos

我正在开发Spring Boot应用程序。 它具有基于输入参数获取的api,某些api的这些参数数量众多,导致在代码库中出现了很多if / else,if / else嵌套的情况。 有人可以提出防止这种情况的建议吗,或者在Java中存在一些设计模式来专门避免这种情况。

代码看起来像这样-

        if (waybillData.getEtimName() != null) {
            etimName = waybillData.getEtimName();
        }
        if (waybillData.getVehicleNo() != null) {
            busno = waybillData.getVehicleNo();
        }
        if (waybillData.getIssuedTickets() != null) {
            issuedTickets = waybillData.getIssuedTickets().toString();
        }
        if (waybillData.getIssuedRolls() != null) {
            issuedRolls = waybillData.getIssuedRolls().toString();
        }

        if (waybillData.getWaybillStatus() != null) {
            status = waybillData.getWaybillStatus();
        }
        if (waybillData.getFuel() != null) {
            fuel = waybillData.getFuel().toString();
        }

另一个例子-

if (userInfo.getagencyId() != null && userInfo.getDepotId() != null) {
    if (!search.isEmpty()) {
        if (fromdate != null) {
            if (status.isPresent()) {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusSearchAgencyAndDepotPageable(
                    fromDate,toDate,status.get(),search,userInfo.getagencyId(),userInfo.getDepotId(),page);
            } else {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusSearchAgencyAndDepotPageable(
                    fromDate,page);
            }
        } else {
            if (status.isPresent()) {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusSearchAgencyAndDepotPageable(
                    status.get(),page);
            } else {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusSearchAgencyAndDepotPageable(
                    search,page);
            }
        }
    } else {
        if (fromdate != null) {
            if (status.isPresent()) {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusAgencyAndDepotPageable(
                    fromDate,page);
            } else {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusAgencyAndDepotPageable(
                    fromDate,page);
            }
        } else {
            if (status.isPresent()) {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusAgencyAndDepotPageable(
                    status.get(),page);
            } else {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusAgencyAndDepotPageable(
                    userInfo.getagencyId(),page);
            }
        }
    }
} else if (userInfo.getagencyId() != null) {
    if (!search.isEmpty()) {
        if (fromdate != null) {
            if (status.isPresent()) {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusSearchAgencyPageable(
                    fromDate,page);
            } else {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusSearchAgencyPageable(
                    fromDate,page);
            }
        } else {
            if (status.isPresent()) {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusSearchAgencyPageable(
                    status.get(),page);
            } else {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusSearchAgencyPageable(search,page);
            }
        }
    } else {
        if (fromdate != null) {
            if (status.isPresent()) {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusAgencyPageable(fromDate,page);
            } else {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusAgencyPageable(fromDate,page);
            }
        } else {
            if (status.isPresent()) {
                allwaybillCollection = wayBillRepository.findWaybillOnDateAndStatusAgencyPageable(status.get(),page);
            } else {
                allwaybillCollection = wayBillRepository
                    .findWaybillOnDateAndStatusAgencyPageable(userInfo.getagencyId(),page);
            }
        }
    }
ranran4 回答:Java中的一些方法或现有设计模式,用于防止发生许多if / else条件,从而导致参数检查的cos

对于第一部分,您可以使用Optional.ofNullable。引入涵盖所有参数的类将很有帮助。

class DTO {
    String etimName;
    String busNo;
    String issuedTickets;
    String issuedRolls;
    String status;
    String fuel;

    public DTO() {
    }

    // getters and setters

比:

DTO dto = new DTO();

Optional.ofNullable(waybillData.getEtimName()).ifPresent(dto::setEtimName);
Optional.ofNullable(waybillData.getVehicleNo()).ifPresent(dto::setBusNo);
Optional.ofNullable(waybillData.getIssuedTickets()).map(Objects::toString).ifPresent(dto::setIssuedTickets);
Optional.ofNullable(waybillData.getIssuedRolls()).map(Objects::toString).ifPresent(dto::setIssuedRolls);
Optional.ofNullable(waybillData.getWaybillStatus()).ifPresent(dto::setStatus);
Optional.ofNullable(waybillData.getFuel()).map(Objects::toString).ifPresent(dto::setFuel);

或者您可以介绍地图(假设将始终使用toString

Map<Supplier<Object>,Consumer<String>> mapThis = Map.of(
        waybillData::getEtimName,dto::setEtimName,waybillData::getVehicleNo,dto::setBusNo,waybillData::getIssuedTickets,dto::setIssuedTickets,waybillData::getIssuedRolls,dto::setIssuedRolls,waybillData::getWaybillStatus,dto::setStatus,waybillData::getFuel,dto::setFuel
        );
mapThis.entrySet().stream().forEach(e -> {
    Optional.ofNullable(e.getKey().get()).map(Objects::toString).ifPresent(e.getValue());
});

对于第二部分,我看不到好的解决方案。您可以使用mapPredicate再试一次,例如前两个语句的示例:

Predicate<Object> testAgencyIdAndDepotId = (v) -> userInfo.getAgencyId() != null && userInfo.getDepotId() != null;
Predicate<Object> testSearch = (v) -> !search.isEmpty();
Predicate<Object> testFromdate= (v) -> fromdate != null;
Predicate<Object> testStatus = (v) -> status.isPresent();

Map<Predicate<Object>,Supplier<Object>> mapIf = Map.of(
        testAgencyIdAndDepotId.and(testSearch).and(testFromdate).and(testStatus),() -> wayBillRepository.findWaybillOnDateAndStatusSearchAgencyAndDepotPageable(
                fromDate,toDate,status.get(),search,userInfo.getAgencyId(),userInfo.getDepotId(),page),testAgencyIdAndDepotId.and(testSearch).and(testFromdate).and(Predicate.not(testStatus)),userInfo.getDepotId()
                page)
        // other conditions
);

allwaybillCollection = mapIf.entrySet().stream().filter(e -> e.getKey().test(null)).findFirst()
        .map(Map.Entry::getValue).map(Supplier::get).orElse(null);
本文链接:https://www.f2er.com/3111117.html

大家都在问