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))