我想确定显示点集合所需的最小面积。最简单的方法是像这样遍历整个集合:
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
在一个单一的流操作?
与类推IntSummaryStatistics
,创建一个PointStatistics
收集所需信息的类。它定义了两种方法:一种用于记录a的值Point
,一种用于组合两个的值Statistics
。
class PointStatistics {
private int minX = Integer.MAX_VALUE;
private int maxX = Integer.MIN_VALUE;
private int minY = Integer.MAX_VALUE;
private int maxY = Integer.MIN_VALUE;
public void accept(Point p) {
minX = Math.min(minX, p.x);
maxX = Math.max(maxX, p.x);
minY = Math.min(minY, p.y);
maxY = Math.max(minY, p.y);
}
public void combine(PointStatistics o) {
minX = Math.min(minX, o.minX);
maxX = Math.max(maxX, o.maxX);
minY = Math.min(minY, o.minY);
maxY = Math.max(maxY, o.maxY);
}
// getters
}
然后,您可以将收集Stream<Point>
到中PointStatistics
。
class Program {
public static void main(String[] args) {
List<Point> points = new ArrayList<>();
// populate 'points'
PointStatistics statistics = points
.stream()
.collect(PointStatistics::new, PointStatistics::accept, PointStatistics::combine);
}
}
更新
我完全对 OP得出的结论感到困惑,所以我决定编写JMH基准测试。
基准设置:
# JMH version: 1.21
# VM version: JDK 1.8.0_171, Java HotSpot(TM) 64-Bit Server VM, 25.171-b11
# Warmup: 1 iterations, 10 s each
# Measurement: 10 iterations, 10 s each
# Timeout: 10 min per iteration
# Benchmark mode: Average time, time/op
对于每次迭代,我都生成大小为100K,1M,10M 的随机Point
s(new Point(random.nextInt(), random.nextInt())
)共享列表。
结果是
100K
Benchmark Mode Cnt Score Error Units
customCollector avgt 10 6.760 ± 0.789 ms/op
forEach avgt 10 0.255 ± 0.033 ms/op
fourStreams avgt 10 5.115 ± 1.149 ms/op
statistics avgt 10 0.887 ± 0.114 ms/op
twoStreams avgt 10 2.869 ± 0.567 ms/op
1M
Benchmark Mode Cnt Score Error Units
customCollector avgt 10 68.117 ± 4.822 ms/op
forEach avgt 10 3.939 ± 0.559 ms/op
fourStreams avgt 10 57.800 ± 4.817 ms/op
statistics avgt 10 9.904 ± 1.048 ms/op
twoStreams avgt 10 32.303 ± 2.498 ms/op
10M
Benchmark Mode Cnt Score Error Units
customCollector avgt 10 714.016 ± 151.558 ms/op
forEach avgt 10 54.334 ± 9.820 ms/op
fourStreams avgt 10 699.599 ± 138.332 ms/op
statistics avgt 10 148.649 ± 26.248 ms/op
twoStreams avgt 10 429.050 ± 72.879 ms/op
问题内容: 我有以下JSON,我需要使用JSONPath获得纯值: 我使用的表达式是,但是我总是得到一个数组: 而不是字符串值()。 问题答案: 但是我总是得到一个数组: 那是必然的。如您在本文档中所读,位于“结果”下(几乎在底部): 请注意,jsonPath的返回值是一个数组,也是一个有效的JSON结构。因此,您可能想再次将jsonPath应用于结果结构,或使用您喜欢的数组方法之一对其进行排序。
我将Python与SQLAlchemy(在我的特殊情况下是GeoAlchemy)一起使用,并且我有一个查询,该查询将生成一列行对象。我希望从这些行对象中提取特定的值,但是SQLAlchemy将行对象解释为单个实体(如果我正确的话,将它们作为字符串返回)。如何在不使用Python解析的情况下更清晰地返回这些单独的值? 我的真实生活用例:PostgreSQL的PostGIS扩展提供了一个名为的函数。此
问题内容: 我想在单个请求中发送多个不同的JSON对象,我觉得在单个请求中像文件一样流式传输多个JSON对象会更好,所以请告诉我是否可行,如果可以的话请给我一个思路要使用Alamofire做到这一点,下面是我要发布的原始正文(应用程序/ json)数据的格式 我尝试了下面的代码,但是由于body参数的格式不正确,因此无法正常工作,这就是我想尝试在单个请求中将多个JSON对象作为流发送的原因,请注意
我必须提取两个值(最小
我试图弄清楚是否有可能返回某种流(可能是内存流?)我从我的桶里得到的东西。 S3 bucket包含很多不同类型的图像、文档等。所有这些都应该在我的网站上使用。但是,我不想显示AWS S3存储桶的路径 这就是为什么我试图创建一个流,并动态显示图像和可下载文档,而不是使用完整路径。这有意义吗?:-) 我用的是C#/。NET AWS SDK。 期待听到任何想法和方向指向!
问题内容: 可以说我有一个单词列表,我想创建一个将新列表的大小作为参数并返回新列表的方法。我如何从原始sourceList中获得随机单词? 那么,如何以及在哪里可以使用我的随机数? 问题答案: 我找到了适当的解决方案。Random提供了一些返回流的方法。例如ints(size)会创建一个随机整数流。