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 -> i
muito 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 -> i
parece 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::intValue
tem 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.
mapToLong
para evitar estouros, dependendo dos valores que seu mapa possa ter.