gpt4 book ai didi

java - 优化java 8流操作

转载 作者:行者123 更新时间:2023-12-01 09:49:19 25 4
gpt4 key购买 nike

所以我试图尽可能优化我的代码。以下代码过去运行时间为 5 秒左右,但我设法将其减少到大约 1.4 秒,但这仍然不够。我可以做什么来进一步优化这段代码? (也许我应该提到我谈到的时间发生在 aux Map 最终有 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:也许我应该解释一下这个方法背后的想法。它的主要目的是对 map 辅助进行排序并返回一个包含已排序键的列表(键也被修改,但这不是主要目的)

最佳答案

您可以尝试将 forEach 语句替换为 mapcollect,如 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使您的计算可并行化。

关于java - 优化java 8流操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com