通过使用java 8流对集合进行排序,将集合转换为Map

Moh*_*nan 16 java collections linkedhashmap java-8

我有一个列表,我需要自定义排序,然后转换为具有其Id与名称映射的地图.

这是我的代码:

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

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

Era*_*ran 43

你有Collectors.toMap这个目的:

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

如果要强制实例化将要实例化的Map实现,请使用以下命令:

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

  • @MohdAdnan无法保证返回的实现.您可以使用[4参数版本](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util)强制执行您希望的实现. function.Function-java.util.function.Function-java.util.function.BinaryOperator-java.util.function.Supplier-).使用最后一个参数 - 供应商 - 您可以指定将实例化哪个Map实现. (4认同)
  • 请注意,此实现将省略重复键的第二个条目. (3认同)
  • toMap 会在 HashMap 中转换它吗?哪个不能保证排序? (2认同)