Java 为什么按值对地图进行番石榴排序有效?
我是Guava库的新手,尝试使用它的一些类来简化代码。我遇到了按值对地图排序的需要。找到一个快速搜索,该搜索将接受的答案发布为以下代码段:Java 为什么按值对地图进行番石榴排序有效?,java,generics,guava,Java,Generics,Guava,我是Guava库的新手,尝试使用它的一些类来简化代码。我遇到了按值对地图排序的需要。找到一个快速搜索,该搜索将接受的答案发布为以下代码段: Ordering<Map.Entry<Key, Value>> entryOrdering = Ordering.from(valueComparator) .onResultOf(new Function<Entry<Key, Value>, Value>() { public Value app
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
在这种情况下,这意味着:
<F> = Entry<Key, Value>
<? extends T> = Value
=条目
这里创建了三种不同的订单,其中一种订单的类型不同于其他订单。您的代码将被改写为:
Ordering<Value> valueOrdering = Ordering.from(valueComparator);
Ordering<Map.Entry<Key, Value>> entryOrdering = valueOrdering
.onResultOf(new Function<Entry<Key, Value>, Value>() {
public Value apply(Entry<Key, Value> entry) {
return entry.getValue();
}
});
Ordering<Map.Entry<Key, Value>> finalOrdering = entryOrdering.reverse();
Ordering valueOrdering=Ordering.from(valueComparator);
Ordering entryOrdering=valueOrdering
.onResultOf(新函数(){
公共值应用(条目){
返回条目.getValue();
}
});
Ordering finalOrdering=entryOrdering.reverse();
此处创建了三种不同的订单,其中一种订单的类型不同于其他订单。您的代码将被改写为:
Ordering<Value> valueOrdering = Ordering.from(valueComparator);
Ordering<Map.Entry<Key, Value>> entryOrdering = valueOrdering
.onResultOf(new Function<Entry<Key, Value>, Value>() {
public Value apply(Entry<Key, Value> entry) {
return entry.getValue();
}
});
Ordering<Map.Entry<Key, Value>> finalOrdering = entryOrdering.reverse();
Ordering valueOrdering=Ordering.from(valueComparator);
Ordering entryOrdering=valueOrdering
.onResultOf(新函数(){
公共值应用(条目){
返回条目.getValue();
}
});
Ordering finalOrdering=entryOrdering.reverse();
可能您被这样的事实弄糊涂了,类排序
声明为排序
,但是onResultOf
方法的返回值是排序
您提供给onResultOf
的函数的第一个类型参数是结果的类型参数
这也意味着,Value
不是强制成为Map的子类型。Entry
可能您被以下事实弄糊涂了,类Ordering
声明为Ordering
,但是onResultOf
方法的返回值是Ordering
您提供给onResultOf
的函数的第一个类型参数是结果的类型参数
这也意味着,值
不强制成为映射的子类型。条目
onResultOf
的方法签名为:
public <F> Ordering<F> onResultOf(Function<F,? extends T> function)
因此,onResultOf
的参数实际上是Function
,因此,第二个参数不必扩展映射。条目onResultOf
的方法签名为:
public <F> Ordering<F> onResultOf(Function<F,? extends T> function)
因此,onResultOf
的参数实际上是Function
,因此,第二个参数不必扩展Map.Entry