簡體   English   中英

Java8流和過濾器

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

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