是否有一种简洁、惯用的方式来从 Javaslang / Vavr 创建一个保持顺序的映射List
?List.toMap()
返回一个 plain HashMap
,所以不这样做。我现在拥有的是这样的——
listOfKeys.foldLeft(
LinkedHashMap.<Key, Value>.empty(),
(m, k) -> m.put(k, valueFor(k))
);
- 但这似乎比必要的更冗长,而且效率也可能更低。
是否有一种简洁、惯用的方式来从 Javaslang / Vavr 创建一个保持顺序的映射List
?List.toMap()
返回一个 plain HashMap
,所以不这样做。我现在拥有的是这样的——
listOfKeys.foldLeft(
LinkedHashMap.<Key, Value>.empty(),
(m, k) -> m.put(k, valueFor(k))
);
- 但这似乎比必要的更冗长,而且效率也可能更低。
该Value.collect
方法(由 继承List
)通常用于此目的,类似于 Java 8 Stream 的collect
方法。它需要一个收集器来执行一个可变的归约(见注)。VavrLinkedHashMap
提供了一个静态collector()
方法,因此您可以使用它来获取一个收集器的实例,该收集器将收集到一个LinkedHashMap
.
listOfKeys.map(key -> new Tuple2<>(key, valueForKey(key)))
.collect(LinkedHashMap.collector());
我不确定与您的解决方案相比它的性能如何,我认为它不会在性能上有所不同,但作为额外的好处,它与 JDK 收集器兼容,因此您可以使用它来收集到 JDK 集合容易地。
* 请注意,由于 Vavr 集合是不可变的,因此可变归约在这种情况下实际上并不可变。
似乎有一个toLinkedMap()
现在。希望在这里能有所帮助。