簡體   English   中英

將列表轉換為地圖 - foreach或stream?

[英]Transform a list into a map - foreach or streams?

我想將List<String>轉換為Map<String, Integer> 列表的值應作為鍵,地圖值將靜態初始化。

我想保持列表的順序,因此使用LinkedHashMap ,並忽略重復。

問題:使用java8 stream API有什么好處嗎? 因為,比較以下內容,只是關於語法我永遠不會去詳細的流api,但總是堅持舊的foreach循環:

    //foreach
    Map<String, Integer> map = new LinkedHashMap<>();
    for (String k : abk) {
        if (k != null) map.put(k, STATIC_VAL);
    }

    //streams
    Map<String, Integer> map2 = abk.stream()
            .filter(Objects::nonNull)
            .collect(Collectors.toMap(
                        Function.identity(),
                        k -> STATIC_VAL,
                        (v1, v2) -> v1,
                        LinkedHashMap::new));

你會堅持使用舊方法還是使用新的lambda表達式?

對於這個簡單的例子, 會堅持使用for循環。 順便說一句,它也更快(除了更具可讀性), Stream確實需要使用基礎設施的成本。 這個新API只是一個工具,因為每個工具都有優點/缺點。

通常我只在必須時使用流api - 讓我們說List需要過濾或映射到其他東西等等 - 然后Stream使用是有意義的。 如果有多個操作需要完成,那么使代碼更容易閱讀,然后用循環做同樣的事情; 但情況並非如此 - 如你的例子所示。

並行化(如果你真的需要它是另一個方面)。 簡單的for循環不容易並行化,但對於流,這是一件輕而易舉的事。

您可以使用傳統的for循環中的變體:

Map<String, Integer> map = new LinkedHashMap<>();
abk.forEach(k -> if (k != null) map.put(k, STATIC_VAL));

但這只是風格問題。 這種方式或傳統的for循環對我來說都很好。 另一方面,使用流更簡潔,更不易讀,IMO。

您可以使用流編寫for-each。 例如。

abk.stream()
    .filter(Object::notNull)
    .forEach(s->map.put(s, STATIC_VAL));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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