アイテムのコレクションがあるとしましょう:
class Item {
public String title;
public int price;
}
List<Item> list = getListOfItems();
Guavaライブラリを使用して、リストから最大価格のアイテムを取得したいです( Ordering 、私は推測します)。このGroovyコードに似たものを意味します:
list.max{it.price}
それ、どうやったら出来るの?どのくらい効率的ですか?
Ordering<Item> o = new Ordering<Item>() {
@Override
public int compare(Item left, Item right) {
return Ints.compare(left.price, right.price);
}
};
return o.max(list);
可能な限り効率的です。リストのアイテムを反復処理し、最大価格のアイテムの最初のO:nを返します。
JBの答えによれば、次のように、自然な順序を持つ値を操作するときに、いくつかの略記を使用することもできます。
Ordering.<Integer> natural().max(listOfIntegers);
詳細については、 Ordering.natural() を参照してください。
あなたはグアバなしでこれを行うことができます。
コレクションは、コンパレータを取るオーバーロードを含む、任意のコレクションで動作する min
および max
メソッドを提供します。ここでは、Java 8 Comparator静的メソッドとラムダを使用して簡潔にコンパレーターを指定しますが、Java 8の前に匿名クラスを使用できます。
Item max = Collections.max(list, Comparator.comparingInt(i -> i.price));
コレクションが空の場合、これらのメソッドはNoSuchElementExceptionをスローします。
Java 8ストリームは、コンパレータを使用する min
および max
関数を提供します。これらの関数は、空のストリームを適切に処理するためにOptional<T>
を返します。 Comparatorの静的メソッドは、自然順序付けの一般的なケースを含め、コンパレーターを簡潔に指定するのに役立ちます。この質問には、使用します
Optional<Item> max = list.stream().max(Comparator.comparingInt(i -> i.price));
これは、すべてのCollection実装とファイルなどの他のものを含むすべてのストリームソースで機能し、ストリームをフィルタリングすることでコレクションのサブセットの最大値を簡単に計算できます。大規模なコレクションと高価なコンパレータ(たとえば、Stringの自然順序付け)がある場合は、パラレルストリームを使用できます。
(脇:理想的には、ストリームはmin
およびmax
オーバーロードを提供し、ストリームタイプがComparableを実装するときに引数を取りません。残念なことに、Javaは、型パラメーターで、この場合だけStreamを拡張する新しいStreamOfComparableインターフェイスを導入する価値はありません。)