Uniwersalne funkcje

Tablica Integer… zamiast Integer[]

W poprzednim artykule pisaliśmy serię prostych funkcji dodających do siebie wiele liczb całkowitych. Problem polegał na tym, że w zależności od tego, ile liczb chcieliśmy do siebie dodać, to musieliśmy użyć metody, która potrafi dodać do siebie dokładnie tyle liczb, ile potrzebujemy.

Czy da się więc napisać jedną funkcję na tyle uniwersalną, by potrafiła dodać do siebie tyle liczb, ile akurat potrzebujemy? Otóż da się.

Wykorzystanie tablicy

Przede wszystkim możemy napisać funkcję, która zamiast wielu argumentów – liczb całkowitych – przyjmować będzie tylko jeden w postaci tablicy liczb. I w zależności od tego, jaki będzie rozmiar tablicy, to tyle liczb do siebie zostanie dodanych. Przykład poniżej oraz na Repl.it:

public class Main {

    public static void main(String[] args) {

        Integer[] tablicaLiczb = new Integer[] {1, 2, 3, 4, 5};
        Integer suma = dodaj(tablicaLiczb);
        System.out.println(suma);
    }

    public static Integer dodaj(Integer[] tab) {
        Integer suma = 0;

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

        return suma;
    }
}

Funkcja dodaj() jest dość prosta. W pętli – która wykona się tyle razy, ile w tablicy jest liczb – dodajemy do siebie kolejne elementy tablicy i na koniec zwracamy uzyskaną sumę.

Jest już całkiem fajnie – mamy uniwersalną funkcję do sumowania wielu liczb. Jedyny warunek, to musimy przygotować tablicę liczb, które chcemy zsumować.

Można jeszcze lepiej

Okazuje się, że można naszą funkcję zrobić jeszcze bardziej uniwersalą. Tak, by nie trzeba było nawet deklarować wcześniej tablicy liczb.

Funkcję napiszemy tak, by jako argumenty przyjmowała liczby całkowite, ale tak by umożliwiała podanie zarówno jednej, jak i wielu liczb.

public class Main {

    public static void main(String[] args) {

        Integer suma = dodaj(1, 2, 3, 4, 5, 6);
        System.out.println(suma);
    }

    public static Integer dodaj(Integer... tab) {
        Integer suma = 0;

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

        return suma;
    }
}

Funkcja dodaj() w powyższym przykładzie wygląda prawie tak samo, jak wcześniej. Jedyna różnica to argument przekazywany do funkcji. W pierwszej wersji była to tablica liczb całkowitych (czyli typ Integer[]). W drugim przypadku typ argumentu to Integer…

Co oznaczają te trzy kropki? Oznaczają one tyle, że funkcja nadal będzie spodziewała się tablicy liczb całkowitych. Jednak nie trzeba jej wcześniej tworzyć. Utworzona zostanie ona automatycznie na podstawie listy przekazanych liczb. Czyli jeśli przekażemy funkcji np. 5 liczb, to zostanie z nich utworzona tablica 5-elementowa.

Funkcja działa tak samo, ale wywołanie funkcji jest zdecydowanie bardziej przejrzyste. Nie musimy tworzyć tablicy liczb i jej przekazywać – wystarczy przekazać tyle liczb, ile chcemy zsumować. Np.:

Integer suma = dodaj(1, 2, 3, 7, 8, 9);