Eu quero somar uma lista de números inteiros. Funciona da seguinte maneira, mas a sintaxe não parece correta. O código pode ser otimizado?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
i -> imuito claro, pessoalmente. Bem, sim, você precisa saber que o valor será automaticamente fora da caixa, mas é verdade, pois Java 5 ...
foo(int i)não escrevem foo(myInteger.intValue());cada vez que o chamam (ou pelo menos eu espero que não !!). Concordo com você que Integer::intValueé mais explícito, mas acho que o mesmo se aplica aqui. As pessoas deveriam aprender uma vez e então você terminou :-). Não é como se houvesse alguma ofuscação mágica.
i -> iparece um no-op e conceitualmente, é um no-op. Claro, sob o capô Integer.intValue()é chamado, mas ainda mais profundo, os métodos são incorporados para se tornar exatamente o não operacional que parece no código-fonte. Integer::intValuetem o ponto de bônus de não criar um método sintético no código de bytes, mas não é o que deve orientar sua decisão de como organizar seu código-fonte.
mapToLongpara evitar estouros, dependendo dos valores que seu mapa possa ter.