【发布时间】:2019-05-30 11:05:27
【问题描述】:
我想确定显示一组点所需的最小面积。最简单的方法是像这样遍历集合:
int minX = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE;
int minY = Integer.MAX_VALUE;
int maxY = Integer.MIN_VALUE;
for (Point point: points) {
if (point.x < minX) {
minX = point.x;
}
if (point.x > maxX) {
maxX = point.x;
}
if (point.y < minY) {
minY = point.y;
}
if (point.y > maxY) {
maxY = point.y;
}
}
我开始了解流。为此,您可以执行以下操作:
int minX = points.stream().mapToInt(point -> point.x).min().orElse(-1);
int maxX = points.stream().mapToInt(point -> point.x).max().orElse(-1);
int minY = points.stream().mapToInt(point -> point.y).min().orElse(-1);
int maxY = points.stream().mapToInt(point -> point.y).max().orElse(-1);
两者都给出相同的结果。然而,虽然流方法很优雅,但速度要慢得多(正如预期的那样)。
有没有办法在单个流操作中获得minX、maxX、minY 和maxY?
【问题讨论】:
-
使用描述所有位置的自定义类型创建
Collector,并不比您的迭代方法 imo 好多少(例如提取到自己的方法中)。 -
@AkinerAlkan:
maxX实际上设置为Integer.MIN_VALUE。这意味着条件if (point.x > maxX)肯定会变为true(除非所有x 值都等于Integer.MIN_VALUE,这是极不可能的)。
标签: java java-8 java-stream