【问题标题】:Converting a collection to Map by sorting it using java 8 streams通过使用 java 8 流对其进行排序将集合转换为 Map
【发布时间】:2018-12-05 16:36:44
【问题描述】:

我有一个列表,我需要对其进行自定义排序,然后将其转换为带有 ID 与名称映射的映射。

这是我的代码:

Map<Long, String> map = new LinkedHashMap<>();
list.stream().sorted(Comparator.comparing(Building::getName)).forEach(b-> map.put(b.getId(), b.getName()));

我认为这可以完成这项工作,但我想知道我是否可以避免在这里创建 LinkedHashMap 并使用花哨的函数式编程来完成这项工作。

【问题讨论】:

  • 使用toMap() of java.util.stream.Collectors
  • 除了使用collect 更可取之外,您应该注意sorted(…).forEach(…) 是错误的(尽管它有时有效)。你真正的意思是sorted(…).forEachOrdered(…)

标签: java collections java-8 linkedhashmap


【解决方案1】:

你有 Collectors.toMap 用于此目的:

Map<Long, String> map = 
    list.stream()
        .sorted(Comparator.comparing(Building::getName))
        .collect(Collectors.toMap(Building::getId,Building::getName));

如果您想强制将要实例化的 Map 实现,请使用:

Map<Long, String> map = 
    list.stream()
        .sorted(Comparator.comparing(Building::getName))
        .collect(Collectors.toMap(Building::getId,
                                  Building::getName,
                                  (v1,v2)->v1,
                                  LinkedHashMap::new));

【讨论】:

  • toMap 会在 HashMap 中转换它吗?哪个不能保证排序?
  • @MohdAdnan 不保证返回的实现。您可以使用4 parameter version 强制执行您希望的实现。使用最后一个参数 - 供应商 - 您可以指定将实例化哪个 Map 实现。
  • 请注意,此实现将省略重复键的第二个条目。
  • @Masud 我假设在这个用例中没有重复。如果有,groupingBy Collector 可能更合适。
  • 鉴于地图实现决定排序,是否需要.sorted(Comparator.comparing(Building::getName))这一行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多