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();
java
java-8
java-stream
som do membro
fonte
fonte
mapToLong
para evitar estouros, dependendo dos valores que seu mapa possa ter.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 escrevemfoo(myInteger.intValue());
cada vez que o chamam (ou pelo menos eu espero que não !!). Concordo com você queInteger::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.Respostas:
Isso funcionará, mas o
i -> i
está fazendo algum desembalagem automática e é por isso que "parece" estranho. Qualquer um dos seguintes procedimentos funcionará e melhor explicará o que o compilador está fazendo sob o capô com sua sintaxe original:fonte
BigDecimal sum = numbers.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
Sugiro mais 2 opções:
O segundo usa
Collectors.summingInt()
coletor, há também umsummingLong()
coletor com o qual você usariamapToLong
.E uma terceira opção: o Java 8 apresenta um
LongAdder
acumulador muito eficaz, projetado para acelerar o resumo em fluxos paralelos e ambientes multiencadeados. Aqui, aqui está um exemplo de uso:fonte
Dos documentos
Então, para um mapa você usaria:
Ou:
fonte
Você pode usar o método de redução:
ou
fonte
int
, éInteger::sum
Long::sum
queInteger::sum
.Você pode usar
reduce()
para somar uma lista de números inteiros.fonte
Você pode usar o método collect para adicionar uma lista de números inteiros.
fonte
Essa seria a maneira mais curta de resumir o
int
tipo de matriz (paralong
matrizLongStream
,double
matrizDoubleStream
e assim por diante).Stream
Porém, nem todos os tipos de números inteiros primitivos ou de ponto flutuante têm a implementação.fonte
IntStream.of()
não vai funcionar para este problema, a menos que nós estamos fazendo algo assustador como este:IntStream.of( integers.values().stream().mapToInt( Integer::intValue ).toArray() ).sum();
integers.values().stream().mapToInt( Integer::intValue ).sum()
.Que isso ajude aqueles que têm objetos na lista.
Se você possui uma lista de objetos e deseja somar campos específicos desse objeto, use o abaixo.
fonte
Eu declarei uma lista de números inteiros.
Você pode tentar usar estas maneiras diferentes abaixo.
Usando
mapToInt
Usando
summarizingInt
Usando
reduce
fonte
fonte
A maioria dos aspectos é coberta. Mas pode haver um requisito para encontrar a agregação de outros tipos de dados além de Inteiro, Longo (para o qual já existe suporte especializado a fluxos). Por exemplo, stram com BigInteger Para esse tipo, podemos usar operações de redução como
Você pode usar o seguinte comando: list.stream ().
fonte