当前位置: 首页 > 知识库问答 >
问题:

Java 8 Collectors.tomap排序映射

牛枫
2023-03-14

我正在使用Java8lambda,并希望使用收集器tomap返回sortedmap。我所能想到的最好方法是使用等于TreeMap::New的虚拟MergeFunctionMapSupplier调用以下CollectorsTomap方法。

public static <T, K, U, M extends Map<K, U>>
        Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                Function<? super T, ? extends U> valueMapper,
                BinaryOperator<U> mergeFunction,
                Supplier<M> mapSupplier) {
    BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element),
            valueMapper.apply(element), mergeFunction);
    return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}

不过,我不想传入合并函数,因为我只想要throwingmerger(),其方式与基本的Tomap实现相同,如下所示:

public static <T, K, U>
        Collector<T, ?, Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper,
                Function<? super T, ? extends U> valueMapper) {
    return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}

使用收集器返回sortedmap的最佳实践方法是什么?


共有1个答案

南门祯
2023-03-14

我不认为你能得到比这更好的东西:

.collect(Collectors.toMap(keyMapper, valueMapper,
                        (v1,v2) ->{ throw new RuntimeException(String.format("Duplicate key for values %s and %s", v1, v2));},
                        TreeMap::new));

其中throwlambda与throwingmerger()相同,但我不能直接调用它,因为它是package private(当然,您总是可以像throwingmerger()那样创建自己的静态方法。)

 类似资料:
  • 我有一个如下所示的集合,我想过滤掉除了不是月末的日期之外的所有内容。 我有以下筛选条件<代码>频率。getEnd返回与给定月底匹配的

  • 我正在proto3中创建消息对象,并使用自动生成的java类。我想为每个消息对象分配唯一的密钥。 在构建期间,它从微服务接收一个名为的原型对象,定义如下: 基于对象中的条目,通过遍历映射并散列每个条目来创建。( protobuf文档说,密钥的顺序无法定义。我应该如何保证在键域中具有相同条目的不同元数据对象生成相同的唯一键?

  • 我有一个映射,其中FullName是一个对象,包含另一个类名为FirstName和LastName的对象。名字和姓氏是字符串。(是的,我知道这是一个糟糕的设计,但我正在努力学习排序) 密钥字符串只是id,比如1,2,3,。。。 我想根据全名(名字和姓氏)进行排序,然后返回一个id列表。 这是我到目前为止的代码,但我在传递比较器的排序部分遇到语法错误。而且我很确定我在做一些语义上不正确的事情。

  • 我不熟悉Java8,不知道如何使用流及其排序方法。如果我有下面的映射,那么如何使用Java8按值对该映射进行排序,从而只获取前10个条目。 我知道在Java 8之前,我们可以按以下链接排序:https://stackoverflow.com/a/109389/4315608

  • 问题内容: 简而言之:无论地图的类型如何,如何按已排序的键顺序遍历地图? 我发现了一些相关的问题,最接近的问题表明,如果不依靠模块,就不可能做到这一点。这种理解正确吗? 考虑下面的Go代码,该代码以其键的排序顺序遍历两个不同类型的映射: 对于两种不同的地图类型,提取键然后对其进行排序的逻辑是重复的。 有什么方法可以排除这种逻辑并避免重复吗? 我在尝试编写提供方法的接口时遇到了麻烦。特别是,of的返