优化java 8流操作

时间:2016-06-08 17:57:41

标签: java optimization java-stream

所以我试图尽可能地优化我的代码。以下代码用于运行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:也许我应该解释这种方法背后的想法。它的主要目的是订购地图辅助并返回一个包含有序键的列表(键也被修改,但这不是主要意图)

1 个答案:

答案 0 :(得分:1)

您可以尝试将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使计算可并行化。