如何用Collectors按矩形周长(length)分组并获取每组最小宽度
问题解决:按周长分组并获取每组最小宽度
你的需求是对ArrayList<Rectangle>按周长(通过getLength()获取)分组,然后计算每组的最小宽度,但当前代码返回的是Map<Double, Optional<Rectangle>>,无法直接得到宽度值。
解决方案1:用reducing直接计算最小宽度
可以直接通过Collectors.reducing跳过中间的Rectangle对象,直接对宽度进行最小值计算,这样返回的就是Map<Double, Double>:
public static Map<Double, Double> groupIdenticalPerimeterWidth(ArrayList<Rectangle> rectangles) { return rectangles.stream() .collect(Collectors.groupingBy( Rectangle::getLength, Collectors.reducing( Double.MAX_VALUE, // 初始值,确保第一个宽度能替换它 Rectangle::getWidth, Math::min ) )); }
解决方案2:处理minBy的结果提取宽度
如果想保留先找最小宽度矩形的逻辑,可以用Collectors.collectingAndThen对minBy的结果进行后续处理,提取宽度并处理Optional:
public static Map<Double, Double> groupIdenticalPerimeterWidth(ArrayList<Rectangle> rectangles) { return rectangles.stream() .collect(Collectors.groupingBy( Rectangle::getLength, Collectors.collectingAndThen( Collectors.minBy(Comparator.comparingDouble(Rectangle::getWidth)), // 提取宽度,若分组为空则抛出异常(根据你的场景调整) optRect -> optRect.map(Rectangle::getWidth).orElseThrow(() -> new IllegalArgumentException("分组中无元素")) ) )); }
说明
- 第一种方案更高效,因为它直接操作宽度值,不需要额外处理
Rectangle对象。 - 第二种方案适合需要先获取最小宽度对应的
Rectangle,再提取宽度的场景,orElseThrow可以根据你的业务需求替换为orElse(0.0)这类默认值,避免空指针问题。
内容的提问来源于stack exchange,提问作者Overdrowsed
相关产品推荐
相关产品推荐

