簡體   English   中英

在 Java 中使用 stream().collect 創建由 2 個列表組成的 Map

[英]Creating Map composed of 2 Lists using stream().collect in Java

例如,有兩個列表:

List<Double> list1 = Arrays.asList(1.0, 2.0);
List<String> list2 = Arrays.asList("one_point_zero", "two_point_zero");

使用Stream,我想創建一個由這些列表組成的映射,其中list1 用於鍵,list2 用於值。 為此,我需要創建一個輔助列表:

List<Integer> list0 = Arrays.asList(0, 1);

這是地圖:

Map<Double, String> map2 = list0.stream()
                .collect(Collectors.toMap(list1::get, list2::get));

list0 按 list1::get 和 list2::get 的順序使用。 有沒有更簡單的方法而不創建list0? 我嘗試了以下代碼,但沒有用:

Map<Double, String> map2 = IntStream
                .iterate(0, e -> e + 1)
                .limit(list1.size())
                .collect(Collectors.toMap(list1::get, list2::get));

您可以使用IntStream生成索引,而不是使用輔助列表來保存索引。

Map<Double, String> map = IntStream.range(0, list1.size())
            .boxed()
            .collect(Collectors.toMap(i -> list1.get(i), i -> list2.get(i)));

實際上,最好的方法是使用IntStream.range(startInclusive, endExclusive)以使用get(index)訪問兩個列表的每個元素,最后使用Math.min(a, b)來避免在列表不存在時獲得IndexOutOfBoundsException大小完全相同,因此最終代碼將是:

Map<Double, String> map2 = IntStream.range(0, Math.min(list1.size(), list2.size()))
    .boxed()
    .collect(Collectors.toMap(list1::get, list2::get));

這對我有用,但是是 O(n^2):

    Map<Double, String> collect =
            list1.stream()
                    .collect(
                            toMap(Double::doubleValue, 
                                    item -> list2.get(list1.indexOf(item))));

暫無
暫無

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

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