【问题标题】:How can I make a map from 2 lists?如何从 2 个列表中制作地图?
【发布时间】:2019-08-24 09:19:45
【问题描述】:

我有2个List<String>s,第一个代表所有项目的列表,第二个代表选定的项目。

所以我会从这些列表中得到一个Map<String, Boolean>,它的键都是list1 的项目,值是list2.contains(itemOfList1)truefalse)。

Map<String, Boolean> mapOfDataListTest = itemList.stream()
.collect(Collectors.toMap(key -> key, value -> true));

【问题讨论】:

  • 附注:除非您明确想要为null 分配某种语义(或者您明确需要Map 用于某些下游方法),否则Map&lt;T, Boolean&gt; 几乎没有意义:它在结构上等同于Set&lt;T&gt;,因为检查Boolean.TRUE.equals(map.get(t))set.contains(t) 相同。

标签: java list java-8 java-stream


【解决方案1】:

value -&gt; true 替换为 lambda item -&gt; list2.contains(item) 或方法引用 list2::contains

itemList.stream()
        .collect(Collectors.toMap(Function.identity(), list2::contains));

并阅读@michalk 的评论。

【讨论】:

  • Set代替List不是更好吗?
  • 这不是问题,我假设数据量不大,因此不会产生显着差异。不过,这是一个很好的观点。
  • 非常好的解决方案,但我同意 HadiJ。应该注意的是,List::contains 是 O(N),如果我们用 Set 替换 list2,我们可以获得更好的性能,因为 Set::contains (通常)是 O(1)。但是,它仍然取决于这两个列表的大小。
【解决方案2】:

试试这个:为了获得更好的性能,请使用Set

Set<String> selected  = new HashSet<>(list2);

Map<String, Boolean> mapOfDataListTest = itemList.stream()
            .collect(Collectors.toMap(key -> key, value ->selected.contains(value) ));

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2022-11-28
    • 2010-12-20
    • 2014-07-08
    相关资源
    最近更新 更多