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

时间:2017-12-08 10:25:28

标签: java java-8 java-stream

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

class Product {
    public BigDecimal price;
}

List<Product> products;
products.stream().min((Product) p -> p.price);

5 个答案:

答案 0 :(得分:6)

由于$(document).on( "touchend click", function(){ $ ( "#menumobile" ).show(); hideMenu(); //hide again after 2 seconds }) 已经是BigDecimal,因此它很简单:

Comparable

答案 1 :(得分:2)

您不需要流来查找最小值。使用Collections.min

Collections.min(products, Comparator.comparing(p -> p.price));

答案 2 :(得分:1)

要解决此问题,请使用以下代码:

products.stream().min(Comparator.comparing(p -> p.price)).get();

Comparator.comparing方法需要一个接受输入并返回Comparable的函数。反过来,此Comparable由比较方法用于创建比较器。 min 方法使用比较器来比较流中的元素。 lambda表达式p->p.price创建一个函数,它接受BigDecimal并返回BigDecimal(这是一个可比较的)。这里,lambda表达式并没有太大作用,但是在你有一个没有实现Comparable的类并且你想要使用该类的属性Comparable来比较该类的对象的情况下,这非常有用。 需要调用get(),因为max(Comparator)返回一个Optional对象。

答案 3 :(得分:1)

你有没有尝试过:

class FieldSerializer(serializers.ModelSerializer):
    class Meta:
        model = Field
        fields = 'id', 'name', 'default'

class DocumentSerializer(serializers.HyperlinkedModelSerializer):
    field = FieldSerializer(many=False, read_only=True)

    def _save_field(self, instance):
        field = self.initial_data.pop('field', None)
        field_ids = field['id']
        field = Field.objects.get(pk=field_ids)
        instance.field = field

    def save(self, **kwargs):
        instance = super().save(**kwargs)
        self._save_field(instance)

答案 4 :(得分:1)

您也可以使用以下内容,

BigDecimal bigDecimal = products.stream()
            .map(d -> d.getPrice())
            .reduce(BigDecimal::min).get();

System.out.println(bigDecimal.longValueExact());