我有这个循环:
List<Integer> numbers = new ArrayList<Integer>();
for(int x=0; x<citiesNames.size();x++){
List<Cities> numeroCiudades = citiesRepository.findByCity(citiesNames.get(x));
numbers.add(numeroCiudades.size());
//System.out.println(numeroCiudades.size());
}
其中cityNames是一个字符串列表,其中包含16584个元素,而findByCity方法是我传递字符串的方法,它在数据库中搜索相应的条目。 我要做的是搜索每个城市的对应条目,检查条目数量,然后将条目数量添加到“整数列表”中。但是此循环太慢,需要很长时间才能显示结果。我该如何优化呢?
答案 0 :(得分:1)
当您可以在cityRepository中创建一个函数返回一个包含特定城市所拥有条目数的int的函数时,我不清楚您为什么必须“打包”列表中的所有城市。 (这将大大提高性能。因此,该程序将能够仅返回一个简单的int而不是整个类的实例化)(假设您有权访问citysRepository)。
此外,可以预先设置分配列表容量。在大型列表上,调整大小可能会导致性能显着下降(有关ArrayList如何工作的更多信息here)
答案 1 :(得分:0)
您可以使用并行流,假设citiesName
是普通的Java集合类型:
citiesName.parallelStream()
.map(citiesRepository::findByCity)
.collect(Collectors.toList())
请注意pitfalls of the parallel stream及其使用共享ForkJoinPool
的方式。
答案 2 :(得分:0)
要优化此循环,您将必须修改findByCity,以便它可以一次处理所有循环。 如果您无法修改findByCity,则可以始终对Streams使用并行性:
int numbers[] = citiesNames.parallelStream()
.mapToInt(c -> citiesRepository.findByCity(c).size())
.toArray();