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