我是 Guava 库的新手,并尝试使用它的一些类来简化我的代码。我遇到了按值对 Map 进行排序的需要。快速搜索发现这篇文章发布了一个接受的答案,如下代码片段:
Ordering<Map.Entry<Key, Value>> entryOrdering = Ordering.from(valueComparator)
.onResultOf(new Function<Entry<Key, Value>, Value>() {
public Value apply(Entry<Key, Value> entry) {
return entry.getValue();
}
}).reverse();
// Desired entries in desired order. Put them in an ImmutableMap in this order.
ImmutableMap.Builder<Key, Value> builder = ImmutableMap.builder();
for (Entry<Key, Value> entry :
entryOrdering.sortedCopy(map.entrySet())) {
builder.put(entry.getKey(), entry.getValue());
}
return builder.build();
// ImmutableMap iterates over the entries in the desired order
有人可以为我澄清一下这是如何工作的吗?我无法理解某些事情。
排序的定义是Ordering<T>
。在这种情况下<T>
将是Map.Entry
. 此外, 的方法签名onResultOf
是onResultOf(Function<F,? extends T> function)
。
在上面的代码中,onResultOf
使用以下参数调用:
onResultOf(new Function<Entry<Key, Value>, Value>())
在这种情况下,这意味着:
<F> = Entry<Key, Value>
<? extends T> = Value
这反过来又意味着 thatValue
是一种可以扩展 a 的类型Map.Entry
。
这怎么可能?当入口映射包含 Key、Value 时,如何Value
成为可以扩展的类型?Map.Entry
我确信我误读或误解了某些东西,但如果有人能对此有所了解,我希望它能帮助我更好地理解 Guava 和 Ordering() 类。尤其是onResultOf(Function)
工作原理。