簡體   English   中英

在 java 中使用 For 循環減少代碼重復

[英]Reducing Code Duplication with For loop in java

    for (Aircraft aircraft : landingQueue) {
        if (aircraft.hasEmergency()) {
            return aircraft;
        }
    }

    for (Aircraft aircraft : landingQueue) {
        if (aircraft.getFuelPercentRemaining() <= 20) {
            return aircraft;
        }
    }

    for (Aircraft aircraft : landingQueue) {
        if (aircraft instanceof PassengerAircraft) {
            return aircraft;
        }
    }
    return landingQueue.get(0);

所以我的程序運行隊列中的飛機列表,並將根據任務的重要性返回一個。 例如,它會首先檢查landingQueue ArrayList 以查看是否有任何飛機處於緊急狀態,如果找不到,則檢查燃油少於20 的飛機,依此類推。 有沒有一種簡單的方法可以減少 for 循環和 if 語句的重復? 非常感激

另一種方法可能是根據您的優先標准對列表進行排序

public Aircraft returnOneBasedOnImportance(){
    Comparator<Aircraft> byEmer = Comparator.comparing(a -> !a.hasEmergency());
    Comparator<Aircraft> byFuel = Comparator.comparing(a -> !(a.getFuelPercentRemaining() <= 20));
    Comparator<Aircraft> byType = Comparator.comparing(a -> !(a instanceof PassengerAircraft));

    return landingQueue.stream()
                       .sorted(byEmer.thenComparing(byFuel).thenComparing(byType))
                       .findFirst().get();
}

這可以通過只遍歷列表一次來完成 - 訣竅是使用變量來跟蹤我們到達了哪個 if 語句。

Aircraft retVal = landingQueue.get(0);
int priority = 0;
for (Aircraft aircraft : landingQueue) {
    if (aircraft.hasEmergency()) {
        retVal = aircraft;
        break;
    }
    if (priority < 2 && aircraft.getFuelPercentRemaining() <= 20) {
        retVal = aircraft;
        priority = 2;
    }
    if (priority < 1 && aircraft instanceof PassengerAircraft) {
        retVal = aircraft;
        priority = 1;
    }
}
return retVal;

您可能希望使用高於 2 的值作為最高優先級,以便為將來要添加其他要檢查的內容留出空間。

改進與代碼重復無關,更重要的是限制了迭代該列表的次數。

Aircraft firstEmergencyAircraft = null;
Aircraft firstLowFuelAircraft = null;
Aircraft firstPassengerAircraft = null;

for (Aircraft aircraft : landingQueue) {
        if (firstEmergencyAircraft==null && aircraft.hasEmergency()) {
            firstEmergencyAircraft = aircraft;
        }
        if (firstLowFuelAircraft==null && aircraft.getFuelPercentRemaining() <= 20) {
            firstLowFuelAircraft = aircraft;
        }
        if (firstPassengerAircraft==null && aircraft instanceof PassengerAircraft) {
            firstPassengerAircraft = aircraft;
        }
    }

if(firstEmergencyAircraft!=null){
    return firstEmergencyAircraft;
}
if(firstLowFuelAircraft!=null){
    return firstLowFuelAircraft;
}
if(firstPassengerAircraft!=null){
    return firstPassengerAircraft;
}
return landingQueue.get(0);

我會讓landingQueue 成為某種SortedSet(即TreeSet),帶有一個按着陸優先級排序的比較器(即排序標准是緊急情況,低燃料水平,是PassangerAircraft)。 然后,您始終可以從列表中選擇第一個(或最后一個)條目。

一種選擇是首先創建一個謂詞 stream,然后為每個謂詞循環列表並嘗試找到匹配的飛機。 如果未找到匹配項,則返回第一個元素。

Stream<Predicate<Aircraft>> predicates = Stream.of(
  (aircraft) -> aircraft.hasEmergency(),
  (aircraft) -> aircraft.getFuelPercentRemaining() <= 20,
  (aircraft) -> aircraft instanceof PassengerAircraft
);

return predicates
  .flatMap((predicate) -> landingQueue.stream().filter(predicate))
  .findFirst()
  .orElse(landingQueue.get(0));

為什么不只在一個循環中進行測試?

for (Aircraft aircraft : landingQueue) {
    if (aircraft.hasEmergency() ||
        aircraft.getFuelPercentRemaining() <= 20 ||
        aircraft instanceof PassengerAircraft) {
        return aircraft;
    }
}

return landingQueue.get(0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM