如何使用java流找到集合中最小的BigDecimal字段?

mem*_*und 3 java java-8 java-stream

我想使用java流来迭代列表并找到BigDecimal最低价格.以下说明,但不起作用(因为min()不能接受BigDecimal.

class Product {
    public BigDecimal price;
}

List<Product> products;
products.stream().min((Product) p -> p.price);
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 7

既然BigDecimal已经是Comparable,它是非常简单:

 BigDecimal min = products
        .stream()
        .map(Product::getPrice)
        .min(Comparator.naturalOrder())
        .orElse(BigDecimal.ZERO);
Run Code Online (Sandbox Code Playgroud)

  • `min(Comparator.comparing(Product::getPrice))` 是您真正想以最低价格获得 `Product` 时的正确工具。如果您只对属性本身感兴趣(如`.map(Product::getPrice)` 所示),则在比较之前映射更有效,`.map(Product::getPrice) .min(Comparator.naturalOrder()) `,因为它将把 `getPrice` 调用的次数减半。 (3认同)
  • 对于大多数实际目的,无论如何都无关紧要,特别是对于像`getPrice`这样的方法,它应该是一个微不足道的getter。只是正确的方法应该成为一种习惯,使其在属性函数不平凡的情况下也正确。 (2认同)