所以我试图尽可能地优化我的代码。以下代码用于运行5秒,但是我设法将其减少到大约1,4秒,但是仍然不够。我还能做些什么来优化此代码? (也许我应该提一下,当辅助地图以170080键结束时,我谈到的时间会发生。)
public List<String> getProdutosMaisCompradosQuantidade(int filial, int X){
Map<String, ProdutoFilial> aux;
if(filial==0) {
aux = new HashMap<>(ValoresFixos.CATALOGO_PRODUTOS_TAMANHO_INICIAL);
filiais.stream()
.forEach( (f) -> {
Map<String, ProdutoFilial> aux2 = f.getMapProdutosDadosFilialSemEncapsulamento();
aux2.forEach((k,t) -> {
if(t.getQuantidade()>0){
if(aux.containsKey(k)) aux.get(k).atualizarValores(t);
else aux.put(k,t);
}
});
});
}
else aux = filiais.get(filial-1).getMapProdutosDadosFilialSemEncapsulamento();
List<String> list =
aux
.entrySet()
.stream()
.sorted(new ComparadorProdutoQuantidade())
.map(e -> e.getKey()+"\n | o Quantidade: "+e.getValue().getQuantidade()+"; Comprado por "+e.getValue().getNumeroCompradores()+" Clientes Distintos")
.collect(Collectors.toList());
if(X>list.size()) X = list.size();
list.subList(X, list.size()).clear();
return list;
}
我在这里使用的所有方法几乎都是O(1)的复杂性,并且比较器也不会太费力,所以不应该是问题,是否有一些我可能不知道可以帮助我优化这个流操作?也许我使用的entrySet可以避免......?因为它可能是这里最昂贵的操作...
EDIT1:也许我应该解释这种方法背后的想法。它的主要目的是订购地图辅助并返回一个包含有序键的列表(键也被修改,但这不是主要意图)
答案 0 :(得分:1)
您可以尝试将forEach
语句替换为map
和collect
,如Java 8 - Best way to transform a list: map or foreach?
然后你可以尝试使用并行流来改善你的表现。
可能会替换使用Stream API创建aux
地图的语句(使用Collectors.toMap和/或Collectors.groupingBy)。这被认为比使用有状态操作的forEach
更清晰。
关于如何做到这一点已经有很多问题https://stackoverflow.com/search?q=groupingBy+[java-stream] 要么 https://stackoverflow.com/search?q=toMap+[java-stream]
如果您需要更快的解决方案(更改更少),您可以尝试将Map
替换为ConcurrentHashMap
并使用并行流。您可以使用its merge function使计算可并行化。