4

是否有一种简洁、惯用的方式来从 Javaslang / Vavr 创建一个保持顺序的映射ListList.toMap()返回一个 plain HashMap,所以不这样做。我现在拥有的是这样的——

listOfKeys.foldLeft(
    LinkedHashMap.<Key, Value>.empty(), 
    (m, k) -> m.put(k, valueFor(k))
);

- 但这似乎比必要的更冗长,而且效率也可能更低。

4

2 回答 2

5

Value.collect方法(由 继承List)通常用于此目的,类似于 Java 8 Stream 的collect方法。它需要一个收集器来执行一个可变的归约(见注)。VavrLinkedHashMap提供了一个静态collector()方法,因此您可以使用它来获取一个收集器的实例,该收集器将收集到一个LinkedHashMap.

listOfKeys.map(key -> new Tuple2<>(key, valueForKey(key)))
    .collect(LinkedHashMap.collector());

我不确定与您的解决方案相比它的性能如何,我认为它不会在性能上有所不同,但作为额外的好处,它与 JDK 收集器兼容,因此您可以使用它来收集到 JDK 集合容易地。

* 请注意,由于 Vavr 集合是不可变的,因此可变归约在这种情况下实际上并不可变。

于 2017-05-25T19:13:29.653 回答
1

似乎有一个toLinkedMap()现在。希望在这里能有所帮助。

于 2017-08-03T05:45:40.720 回答