【发布时间】:2020-08-30 20:34:23
【问题描述】:
我正在使用下面的表达式,来实现以下目标:
在具有相同name::String 的Product 对象之间,提取具有最高weight::BigDecimal 值的产品。
我想通过添加到这个表达式来限制返回 Collection 的长度,但我不确定如何做到这一点 - 具体来说,我想用最多 3 个 Product 对象填充列表,理想情况下,最重的那些。
Collection<Product> heaviestProductsDistinct = products.stream()
.collect(Collectors.toMap(Product::getName, b -> b,
BinaryOperator.maxBy(Comparator.comparing(Product::getPrice))))
.values();
例如,假设我有:
List<Product> products = List.of(
new Product("product1", BigDecimal.valueOf(3), "valid"),
new Product("product1", BigDecimal.valueOf(2), "expired"),
new Product("product1", BigDecimal.valueOf(5), "expired"),
new Product("product2", BigDecimal.valueOf(4), "valid"),
new Product("product2", BigDecimal.valueOf(10), "valid"),
new Product("product3", BigDecimal.valueOf(9), "expired"),
new Product("product3", BigDecimal.valueOf(3)), "valid",
new Product("product4", BigDecimal.valueOf(12), "valid"),
new Product("product4", BigDecimal.valueOf(33), "valid")
);
我的表情会返回:
[Product{name='product4', price=33, condition='valid'}, Product{name='product2', price=10, condition='valid'},
Product{name='product1', price=5, condition='expired'}, Product{name='product3', price=9, condition='valid'}]
因此,我只想保留两个元素,最好是价格最高的元素。
【问题讨论】:
-
你说的是哪个“返回
ArrayList”?您的代码中没有ArrayList。为什么你说“我想用最多 3 个 Product 对象填充列表”,然后又说“我只想保留两个元素”?
标签: java-8 functional-programming java-stream