Collectors.summingInt () vs mapToInt (). Sum ()

Quando você deseja sumr um valor inteiro de um stream, existem duas maneiras principais de fazer isso:

ToIntFunction mapFunc = ... int sum = stream().collect(Collectors.summingInt(mapFunc)) int sum = stream().mapToInt(mapFunc).sum() 

O primeiro envolve encheckboxr o inteiro retornado e desempacotá-lo, mas há um passo extra envolvido no segundo.

Qual é mais eficiente / mais claro?

Você está olhando para a interseção de dois casos de uso distintos. Usar mapToInt(…) permite encadear outras operações IntStream antes da operação do terminal. Por outro lado, Collectors.summingInt(…) pode ser combinado com outros coletores, por exemplo, usado como coletor downstream em um coletor groupingBy . Para esses casos de uso, não há dúvidas sobre qual usar.

Em seu caso especial, quando você não está encadeando mais operações nem lidando com colecionadores em primeiro lugar, não há diferença fundamental entre essas duas abordagens. Ainda assim, usando o que é mais legível tem um ponto. Normalmente, você não usa um coletor, quando há uma operação predefinida no stream fazendo o mesmo. Você não usaria collect(Collectors.reducing(…)) quando você pode usar apenas .reduce(…) , você faria?

Não apenas mapToInt(mapFunc).sum() curto, mas também segue a ordem usual da esquerda para a direita para o que acontece conceitualmente, primeiro converta para um int e some-os. Eu acho que isso justifica a preferência por essa alternativa sobre .collect(Collectors.summingInt(mapFunc)) .