HOWTO · Java

Ottieni la somma di un array in Java

Scopri come trovare la somma di un array in Java usando cicli e stream.

In questa pagina

Per calcolare il totale di un int[] in Java, usa Arrays.stream(numbers).sum() per una soluzione concisa integrata, oppure somma ogni valore con un ciclo for quando vuoi controllare esplicitamente i passaggi. Gli array Java non dispongono di un metodo di istanza sum(); Arrays.stream(int[]) trasforma i valori in un IntStream, che fornisce sum() e reduce().
Sommare un array è una delle operazioni di base sui dati nel Tutorial Java, che ordina le guide su array e collezioni dalle basi agli stream.

Gli esempi seguenti usano gli stessi sei valori, la cui somma è 149. Ogni programma è autonomo e può essere salvato come SimpleTesting.java.

Sommare un array di int con un ciclo for

Con un ciclo normale ogni passaggio è esplicito: si inizializza l’accumulatore, si visita ogni indice e si aggiunge l’elemento corrispondente. È una scelta semplice se vuoi seguire il calcolo o aggiungere altra logica durante l’iterazione.

Questo programma somma i sei valori di numbers e ne stampa il totale. La condizione del ciclo usa numbers.length e il nome dell’array viene usato in modo coerente sia per indicarne la lunghezza sia per accedere agli elementi.

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total = 0;

    for (int i = 0; i < numbers.length; i++) {
      total += numbers[i];
    }

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149

Sommare un array di int con uno stream parallelo e reduce

Per usare uno stream parallelo, chiama parallel() sull’IntStream restituito da Arrays.stream(numbers). Il metodo reduce a due argomenti accetta un valore identità (0) e un’operazione di addizione. Poiché l’addizione è associativa, i subtotali possono essere combinati per ottenere lo stesso risultato. Con un array breve, preferisci la versione sequenziale, a meno che l’elaborazione parallela non sia adatta al carico di lavoro complessivo: l’esecuzione parallela non rende automaticamente più rapido un calcolo piccolo.

import java.util.Arrays;

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total = Arrays.stream(numbers)
        .parallel()
        .reduce(0, (left, right) -> left + right);

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149

Sommare un array di int con Arrays.stream(...).reduce(...)

Per creare uno stream sequenziale, ometti parallel(). Arrays.stream(int[]) restituisce comunque un IntStream; reduce(0, Integer::sum) parte dal valore identità e combina ogni valore primitivo tramite addizione. Il valore identità definisce l’operazione anche quando non ci sono valori da combinare.

import java.util.Arrays;

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total = Arrays.stream(numbers).reduce(0, Integer::sum);

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149

Sommare un array di int con Arrays.stream(...).sum()

Quando l’operazione è un’addizione, sum() esprime l’intento più direttamente di una riduzione. È un’operazione terminale sull’IntStream ottenuto dall’array e restituisce un totale di tipo int.

Poiché questo metodo restituisce un int, il totale usa l’aritmetica intera a 32 bit di Java. Se la somma matematica può superare l’intervallo di int, converti lo stream a un tipo più ampio prima di sommare, per esempio con Arrays.stream(numbers).asLongStream().sum(). Anche il ciclo normale richiede un accumulatore long e la conversione a un tipo più ampio per gestire valori di quell’intervallo.

import java.util.Arrays;

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total = Arrays.stream(numbers).sum();

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149

Sommare un array di int con IntStream.of(...).sum()

IntStream.of(numbers) è un altro modo diretto per creare un IntStream a partire da un int[]. La sua operazione sum() restituisce lo stesso totale di Arrays.stream(numbers).sum(). Scegli la forma che risulta più naturale nel tuo codice.

import java.util.stream.IntStream;

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total = IntStream.of(numbers).sum();

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149

Sommare un array di int con un ciclo for compatto

Il ciclo seguente inserisce inizializzazione, condizione di continuazione e accumulo nell’intestazione del for, quindi visita l’array dall’ultimo indice al primo. È Java valido, ma il corpo vuoto e il decremento nell’espressione di aggiornamento lo rendono meno immediato da leggere rispetto al ciclo normale. Usa la forma più chiara, a meno che la compattezza non sia particolarmente utile.

public class SimpleTesting {
  public static void main(String[] args) {
    int[] numbers = {12, 34, 45, 21, 33, 4};
    int total;
    int i;

    for (total = 0, i = numbers.length - 1;
         i >= 0;
         total += numbers[i--]) {
      // Accumulation happens in the loop update expression.
    }

    System.out.println("Array Sum = " + total);
  }
}
Array Sum = 149