我有一個包含兩個欄位的 Policies 物件:policyNumber 和 policyStatus。我將有一份政策清單,我需要查看是否有任何政策具有我提供的狀態之一。如果有,我將布林值設定為 yes。如果沒有,我將其設定為否。
通常我會像這樣使用嵌套的 for 回圈:
Boolean hasStatus = false;
List<Policy> policies = new List<Policy>();
String[] statuses = String[]{'A1','A3','B6','T1','T6'};
for (Policy policy : policies) {
for (int i=0; i<statuses.length; i ) {
if (policy.policyStatus == statuses[i] {
hasStatus = true;
break;
}
}
}
return hasStatus;
現在我在涉及地圖、集合和集合以及演算法的領域非常周到。我想知道的是,是否有我應該用它做的事情之一,而不是使用嵌套的 for 回圈和 if 塊。如果有的話,你能給我一些指導嗎?或者這真的是我應該做的嗎?
uj5u.com熱心網友回復:
構造一個Set<String>包含狀態的:
Set<String> statusSet = new HashSet<>(statuses);
然后使用流來迭代policies:
return policies.stream().anyMatch(p -> statusSet.contains(p.policyStatus));
uj5u.com熱心網友回復:
您可以將您的Policy類實作為policyStatusand的 Map policyNumber(在這種情況下policyStatus是 keypolicyNumber是 value of Map)并執行您的檢查,如下所示:
Boolean hasStatus = false;
Map<String, Integer> policyMap = getPolicyMap();
String[] statuses = String[]{"A1", "A3", "B6", "T1", "T6"};
for (String status : statuses) {
if(policyMap.get(status) != null){
hasStatus = true;
break;
}
}
return hasStatus;
或者如果您不能這樣做并且您的statuses長度恒定或長度很小,您不應該擔心在您的專案中有一個帶有嵌套回圈的子程式。因為這是不可能的。你所做的是m在陣列上搜索元素n,沒有任何先驗條件或知識,你需要O(nm)比較,所以你需要嵌套回圈。但是正如我所說,您可以使用Map資料結構重構代碼并具有單個回圈。
uj5u.com熱心網友回復:
在深入研究之前,我想解決幾個問題。
List是一個介面,所以你不能實體化這個型別的物件。但是,您可以使用ArrayList它來實體化它。您不必直接使用 訪問成員policy.policyStatus,您應該考慮使用 getter 來確保封裝,因此policy.getStatus().
使用過濾器和地圖!正如安迪雄辯地說,這是一個非常干凈和優雅的解決方案。希望這也有幫助!
簡短補充:我認為 java 流有時有點過于復雜,但它們非常有用。如果您使用 流式傳輸一個集合.stream(),那就是讓 Java 一個一個地查看集合中的每個成員。然后你可以使用一堆很酷的方法。
...stream().map()只是將一個函式一個一個地應用于單個物件。這個函式可以是任何東西!functionjava 中的介面有一個方法R apply(T t);——所以它接受一個輸入,并產生一個輸出。正如你所看到的,R 型別的輸出可能與 T 型別的輸入不同。如果你不想回傳任何東西,你可以forEach直接在集合上使用 collections方法。此方法采用 a consumer,它類似于 afunction但它不回傳任何內容。你也可以做...stream().filter()一個predicate,基本上是一個評估為真或假的問題。所有這些只是為了簡化代碼,java 中的函式式編程實際上在野外非常有用:D
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/377960.html
上一篇:將物件添加到陣列的函式回傳未定義
下一篇:加速我的字串文本替換代碼
