[英]Convert List<String> to Map<String, String> in Java
我想將列表轉換為地圖,其中鍵只是一個計數器,它需要遵守列表的順序。 我目前有這個代碼:
private static Map<String, String> convertListToMap(final List<String> list) {
AtomicInteger counter = new AtomicInteger(0);
Map<String, String> map = list.stream().collect(Collectors.toMap((c) -> {
Integer integer = counter.incrementAndGet();
return integer.toString();
}, (c) -> c));
return map;
}
我有兩個問題:
試試這個方法。
static Map<String, String> convert(List<String> list) {
return IntStream.range(0, list.size()).boxed()
.collect(Collectors.toMap(n -> String.valueOf(n+1), list::get,
(a, b) -> a, LinkedHashMap::new));
}
筆記:
(a, b) -> a
並沒有真正對此做出貢獻。LinkedHashMap::new
的供應商確保保留訂單。 不幸的是,沒有一個Collector.toMap
允許沒有merge
功能的Supplier
。可能您可以使用IntStream
將索引映射為值的鍵,並使用LinkedHashMap
保留順序
IntStream.range(0, list.size())
.mapToObj(i -> new AbstractMap.SimpleEntry<>(String.valueOf(i+1), list.get(i)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> 1, LinkedHashMap::new));
關於您的第一個問題:只要您的號碼不變,您的訂單就會保留。 更好的解決方案是 LinkedList ( https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html ),其中條目按您添加的順序排序(這可能更容易,我不知道你的申請)。
關於你的第二個問題: AtomicInteger 的進步主要是由於更好的線程安全性( AtomicInteger 與 Integer 的性能差異)。 如果您沒有執行任何並發操作,則應該沒有明顯差異。 因此可以使用普通的整數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.