[英]Java8 streams and filters
我有一個set multimap,它存儲了一個月的一些字符串(整數)。
MonthlyCount = {1:["hello"],2:["hello","hi"]}
我有一個地圖,計算每月的字符串數量並添加它們。 我使用containsKey過濾器來檢查密鑰是否存在於集合中,並將它們添加到地圖中。
final String[] months = new DateFormatSymbols().getShortMonths();
final Map<String, Object> metaData = new LinkedHashMap<>();
private SetMultimap<Integer, String> MonthlyCount;
for (int i = 0; i <= month; i++) {
final int count = MonthlyCount.containsKey(i + 1) ? MonthlyCount.get(i + 1).size() : 0;
metaData.put(months[i], count);
}
有沒有辦法用Java8的流和過濾器實現相同的行為?
您可以使用IntStream
迭代所需范圍並使用Collectors.toMap
生成所需的映射:
Map<String,Integer> map =
IntStream.range(0,months.length)
.boxed()
.collect(Collectors.toMap(i->months[i],
i->MonthlyCount.containsKey(i + 1) ? MonthlyCount.get(i + 1).size() : 0));
請注意,您正在做不必要的工作。 看看SetMultimap.get
:
返回與此多圖中的
key
關聯的值的視圖集合(如果有)。 請注意,當containsKey(key)
為false時,返回空集合,而不是null
。
所以你需要在你的循環中做的就是
metaData.put(months[i], MonthlyCount.get(i + 1).size());
因為無論如何它對於缺席鍵都是零。 如果您有一個非番石榴Map<…,Set<…>>
,您可以在Java 8中執行等效操作:
metaData.put(months[i], MonthlyCount.getOrDefault(i + 1, emptySet()).size());
其中emptySet()
是Collections.emptySet()
的靜態導入。
當您想要添加到現有Map
時,我不會重寫循環以使用流。 畢竟,代碼足夠簡潔
for(int i=0; i<month.length; i++)
metaData.put(months[i], MonthlyCount.get(i + 1).size());
流不會變得更好......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.