UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Java】コレクションの中からBigDecimal型のプロパティが最小であるものを求める

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