java - 如何通过 Stream 将 HashMap<String, Long> 更改为 LinkedHashMap<String, Long>

标签 java lambda java-8 java-stream

我是 Java 新手,现在我尝试 lambda/stream。

如何对 Map 进行排序按值(value)?

我尝试了以下方法,但不正确:

time = time.entrySet().stream()
           .sorted(Comparator.comparing(Map.Entry::getValue))
           .collect(Collectors.toMap((String)Map.Entry::getKey, 
                      (Long)Map.Entry::getValue, LinkedHashMap::new));

我找到了以下方法,但不知道如何使用:

Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,   
                        Function<? super T, ? extends U> valueMapper,   
                        BinaryOperator<U> mergeFunction,   
                        Supplier<M> mapSupplier)

最佳答案

您忘记指定合并函数。

time = time.entrySet()
           .stream()
           .sorted(Comparator.comparing(Map.Entry::getValue))
           .collect(Collectors.toMap(Map.Entry::getKey, 
                                    Map.Entry::getValue,
                                    (v1,v2)->v1,
                                    LinkedHashMap::new));

顺便说一句,假设 time 不是原始 Map,您不必将键强制转换为 String 并将值强制转换为。尝试强制转换方法引用 Map.Entry::getKeyMap.Entry::getValue 无论如何都是错误的,因为方法引用实现了 Function 接口(interface),因此如果您希望代码通过编译,则不应将它们转换为 StringLong

关于java - 如何通过 Stream 将 HashMap<String, Long> 更改为 LinkedHashMap<String, Long>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59266395/

相关文章:

java - 函数来确定值是否可以转换为 int、double 或其他类型?

multithreading - 如何可视化嵌套的 lambda 语法?

java - 当我尝试使用 javascript 加载页面时,什么会导致 HtmlUnit 抛出 40 多个异常并失败?

java - 日期年份的 JPA 约束

java - 使用关键组合的错误 criteria.list

c++ - 未记录的 GCC C++11 扩展?在 lambda 捕获列表中捕获任意表达式

c++ - 什么是广义 lambda 捕获,为什么要创建它?

java - CompletableFuture,可变对象和内存可见性

Java 8 Boolean.logicalOr 方法

java - 为什么并行 ForkJoinPool 加倍我的异常?