【问题标题】:How to create a map with key and value equals 0如何创建键和值等于0的映射
【发布时间】:2021-10-11 08:25:38
【问题描述】:

我有一个名为 list1long 列表。
我需要创建一个Map<Long, Long>(使用流api),其中key 是来自list1value,并且这个键的值=0;
例如

list1 = [1, 2, 3, 1, 3]
map = [ [1,0], [2,0], [3,0] ] 

在这种情况下顺序无关紧要

【问题讨论】:

  • "使用流 api" - 这是一个真正的要求还是只是为了学习目的?使用 Stream API,您可以做某事。像list1.stream().collect(Collectors.toMap(k -> k, k -> 0L, (v1, v2) -> 0L)),但传统的循环可能更容易理解和维护。
  • 我删除这个序列,因为没关系
  • @Thomas .distinct().collect(toMap(k -> k, k -> 0L)) 可能会更容易一些。 (但我同意,for 循环可能会更好)。

标签: java stream


【解决方案1】:

如果您需要保留订单,请使用LinkedHashMap

Map<Long, Long> map = 
     list1.stream().collect(Collectors.toMap(x->x, x->0L, (x, y)->x, LinkedHashMap<Long, Long>::new));

否则会更简单:

Map<Long, Long> result = list1.stream().collect(Collectors.toMap(x->x, x->0L, (x, y)->x));

如果没有重复值,那就更简单了:

Map<Long, Long> result = list1.stream().collect(Collectors.toMap(x->x, x->0L));

或者只是使用传统的循环(同意 Thomas,它更容易理解):

Map<Long, Long> map = new LinkedHashMap<>();
for (Long x: list1) {
    map.put(x, 0L);
}

【讨论】:

  • OP 还说“在这种情况下顺序无关紧要”。
  • 他后来在编辑问题时添加了这句话:-)
  • 请注意,Collectors.toMap() 的 2 参数版本在重复键上会失败,因此请使用 3 参数版本(即添加合并功能)或首先使用 distinct(),正如 Andy Turner 指出的那样.
  • 2托马斯。谢谢,我已经更新了答案。
【解决方案2】:

使用简单的 foreach 来替代流:

List<Long> list = List.of(1L, 2L, 3L, 1L, 3L);
Map<Long,Long> map = new HashMap<>();

list.forEach(i -> map.computeIfAbsent(i, v -> 0L));
System.out.println(map);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多