I want to determine the minimum area required to display a collection of points. The easy way is to loop through the collection like this:
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;
}
}
I am getting to know streams. To do the same, you can do the following:
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);
Both give the same result. However, although the streams approach is elegant, it is much slower (as expected).
Is there a way to get minX, maxX, minY and maxY in a single stream operation?
Collectorwith a custom type that describes all the positions, not much better than your iterative approach imo (extracted into its own method for example).maxXis actually set toInteger.MIN_VALUE. That means that the conditionif (point.x > maxX)will definitely becometrue(unless all x-values are equal toInteger.MIN_VALUE, which is highly unlikely).