簡體   English   中英

轉換列表<String>到地圖<String, String>在 Java 中

[英]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;
}

我有兩個問題:

  1. 在我桌面上的一個簡單的控制台應用程序測試中,計數器保留了列表的順序。 我們可以確定訂單在其他任何地方執行時都會保留嗎?
  2. 有沒有更好的方法來編碼?

試試這個方法。

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.

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