1

私は 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。さらに、 のメソッド シグネチャonResultOfonResultOf(Function<F,? extends T> function).

上記のコードでonResultOfは、次のパラメーターを使用して呼び出されています。

onResultOf(new Function<Entry<Key, Value>, Value>())

この場合、次のことを意味します。

<F> = Entry<Key, Value>
<? extends T> = Value

これは、それValueが a を拡張する型であることを意味しMap.Entryます。

そんなことがあるものか?エントリ マップに Key、Value が含まれている場合、どのようValueに拡張するタイプになることができますか?Map.Entry

私は何かを誤解または誤解していると確信していますが、誰かがこれに光を当てることができれば、グアバと Ordering() クラスをもう少しよく理解するのに役立つことを願っています. 特に仕組みonResultOf(Function)

4

3 に答える 3

3

ここでは 3 つの異なる Ordering が作成されており、そのうちの 1 つは他のものとは異なるタイプを持っています。あなたのコードコードは次のように書き直されます:

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();
于 2013-08-08T18:58:12.480 に答える
2

のメソッド シグネチャonResultOfは次のとおりです。

public <F> Ordering<F> onResultOf(Function<F,? extends T> function)

Fが に置き換わりますT。前の定義と一致させるには、次のように書き直します。

public <T> Ordering<T> onResultOf(Function<T,? extends U> function)

パラメータ toonResultOfは実際にはFunction< Map.Entry<Key, Value>, ? extends U >であるため、2 番目のパラメータを拡張する必要はありませんMap.Entry

于 2013-08-08T19:09:57.853 に答える
1

Orderingクラスが として宣言されているにもかかわらず、メソッドOrdering<T>の戻り値が であるという事実に混乱しているかもしれません。onResultOfOrdering<F>

Functionに提供するの最初onResultOfの型引数は、結果の型引数です。

Valueこれは、が のサブタイプである必要がないことも意味しますMap.Entry

于 2013-08-08T19:02:56.767 に答える