[英]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.