所以我有這個回圈
for (Map.Entry<String, Integer> val : map.entrySet()) {
if (val.getValue() >= 10 && !Objects.equals(val.getKey(), " ") && val.getKey().length() > 3) {
stats = stats val.getKey().toLowerCase() " - " val.getValue() "\n";
}
}
現在我想擺脫 for 回圈和使用流的 if 條件。我怎樣才能做到這一點?
uj5u.com熱心網友回復:
這可能是一種方法:
String stats = map.entrySet().stream()
// keep only the entries you're interested in:
.filter(entry -> entry.getKey().length() > 3 && entry.getValue() >= 10)
// serialise entries one by one:
.map(entry -> entry.getKey().toLowerCase() " - " entry.getValue())
// join:
.collect(Collectors.joining("\n"));
uj5u.com熱心網友回復:
要充分利用流功能,您需要使用流、過濾器和減少功能,如下所示:
// Get the stream from entrySet
String result = map.entrySet().stream()
// Filter entries based on your condition
.filter(val -> val.getValue() >= 10
&& !Objects.equals(val.getKey(), " ")
&& val.getKey().length() > 3)
// Apply the reduce to combine filtered entries in a single string
.reduce("", (stats, val) -> stats
val.getKey().toLowerCase()
" - "
val.getValue()
"\n");
應用于 Collection的stream方法給出集合中存在的專案的新 Stream:
回傳以此集合為源的順序流。
應用于流的過濾方法:
回傳由與給定謂詞匹配的此流的元素組成的流。
流物件上的reduce函式:
使用提供的標識值和關聯累積函式對此流的元素執行歸約,并回傳歸約后的值
uj5u.com熱心網友回復:
使用 forEach 方法做得很好。使用流和流 API 是一種很好的做法。
這是一個非常簡單的程式,它執行與您想做的類似的事情。
import java.util.Map;
import java.util.HashMap;
public class Test {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("aaaa", 1);
map.put("bbbb", 2);
map.put("cccc", 3);
map.forEach((k,v)->System.out.println(k ": " v));
}
}
現在我們可以編譯并運行代碼了。
% javac Test.java
% java Test
aaaa: 1
bbbb: 2
cccc: 3
現在,您的代碼中的錯誤是什么?
錯誤是這樣的。Map.forEach 方法采用 BiConsumer。BiConsumer 操作接受兩個輸入引數(k 和 v)并且不回傳任何結果。您正在使用 BiConsumer 操作以三元運算式回傳結果。BiConsumer 操作的回傳型別為 void。所以你可以做的是......你可以在 BiConsumer 操作中執行代碼(就像我在我的示例中所做的那樣),但你不能在 BiConsumer 操作中回傳結果(你正在嘗試這樣做)。
您可以在 Java 檔案中閱讀有關 Map.forEach 方法和 BiConsumer 函式操作的資訊。
- Map.forEach 方法的 Java 檔案
- BiConsumer 操作的 Java 檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/496802.html
上一篇:如何訪問其他類的變數