java - 使用 Java 8 toMap 函数将 HashMap 排序到桶中

标签 java lambda java-8 mapping

我想按每个键所附的特定 等级 对 HashMap 进行分组。键可以是 rank 1 或 2。所以最后,一个给定的输入 HashMap ,如 <String, Integer>应该以这种形式映射和输出 <Integer, Set<String>> - 其中输出映射的键是 rank,值是原始输入映射中属于该排名的所有字符串的集合。如果输出映射中的集合按原始映射中的值降序排列,那也很好。

我原来是这样实现的,效果很好,但是我想用toMap函数,感觉这个方法有点大材小用。

private Set<String> sortByValue(Map<String, Long> iMap) {
    //This is where we are going to bucket our stuff
    Map<Integer, Set<String>> rankSort = new HashMap<Integer, Set<String>>() {{
        put(1, new LinkedHashSet<>());
        put(2, new LinkedHashSet<>());
    }};

    //Just populating rankSort with elements from the map
    iMap.entrySet().stream()
            .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
            .forEachOrdered(e -> rankSort.get(isRank1(e.getKey()) ? 1 : 2).add(e.getKey()));

    return new LinkedHashSet<String>() {{
        addAll(rankSort.get(2));
        addAll(rankSort.get(1));
    }};
}

private boolean isRank1(String val) {
    try {
        return extService.getIt(val).getParent() == null;
    } catch (Exception ex) {
        return false;
    }
}

最佳答案

你要找的不是toMap而是

iMap.entrySet().stream()
    .collect(groupingBy(
        Entry::getValue,
        mapping(Entry::getKey, toSet())));

关于java - 使用 Java 8 toMap 函数将 HashMap 排序到桶中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36924145/

相关文章:

asp.net-mvc-2 - MVC Html.TextBoxFor MaxLength 和 Value

python - 应用来自多列的字符串和整数不起作用的函数

java - 串行 Steam 的性能、内部工作和执行顺序

c# - 修改 Lambda 表达式

Java 将字符串拆分为 Double[ ]

Java 8 将列表按涉及先前元素的条件分组

java - 甲骨文一致性 : How to set the timeout on an invoke call in a replicated cache?

java - Netty:停止重新连接并关闭

java - 如何编写查询参数是列表的 JPARepository 查询?

java - 可以在 Android 的 Web View 中显示从服务接收到的 pdf 字节