Javaのstreamを使ってコレクションの中から最小値を求めたい
なんとなくminを使えば?と思って以下のようにしてみたが上手くいかなかった
class Product { public BigDecimal price; } List<Product> products; products.stream().min((Product) p -> p.price);
javadocをみるとminは引数にComparator
をとる
min(Comparator<? super T> comparator)
なので、Comparator.comparing
を使って以下のようにする必要があった
products.stream().min(Comparator.comparing(Product::getPrice));
もし、最小の価格だけが欲しい場合は、BigDecimalがそもそもComparableであるため、.map(Product::getPrice)
でpriceのコレクションにした上で以下のようにするでもよい
products .stream() .map(Product::getPrice) .min(Comparator.naturalOrder())
ちなみにOptionalではなくなるが、streamを使わなくてもCollections.min
を使ってもできる
Collections.min(products, Comparator.comparing(p -> p.price))