JavaRush /Java Blog /Random-TW /Java 可變參數

Java 可變參數

在 Random-TW 群組發布
今天我們將討論 Java 中的 varargs 這樣的東西。Varargs(或可變參數)是一種允許您建立具有任意數量參數的方法的技術。在本文中,我們將學習如何建立此類方法,討論為什麼需要可變參數以及何時最好使用它們。

什麼是可變參數?

Varargs 是可變長度參數:JDK5 中出現的功能。可變參數允許我們建立具有任意數量參數的方法。總的來說,以前可以創建這樣的方法。確實,這樣做並不是很方便。讓我們舉個例子。假設我們需要編寫一個方法,該方法將採用任意數量的整數參數並將它們加在一起。 Java 可變參數 - 1我們有兩個選擇。 選項 1 - 過載:
class Calculator {
    int sum(int a, int b){...};
    int sum(int a, int b, int c){...};
    int sum(int a, int b, int c, int d){...};
    int sum(int a, int b, int c, int d, int e){...};
}
但超載有兩個問題。首先,並不總是清楚什麼時候該停止,其次,這很麻煩。數組更好。 選項 2 - 陣列:
class Calculator {
    int sum(int[] numbers){...};
}
有了數組就不再麻煩了,而且數組看起來好像沒什麼…直到呼叫方法的時候:
public static void main(String... sss) {
    Calculator calculator = new Calculator();

    int[] arguments = new int[7];
    arguments[0] = 1;
    arguments[1] = 10;
    arguments[2] = 123;
    arguments[3] = 234;
    arguments[4] = 6234;
    arguments[5] = 12;
    arguments[6] = 8;

    int sum = calculator.sum(arguments);
}
我們同意,當然,您可以更簡短地寫下所有內容。但首先,我仍然想證明使用陣列作為可變長度參數的不便,其次,即使我們這樣寫:
int[] arguments = {1,10,123,234,6234,12,8};
int sum = calculator.sum(arguments);
那我們仍然無法擺脫過多的程式碼。然而,隨著Java 5的發布,Varargs特性的出現解決了這些問題。它使得向方法傳遞任意數量的參數成為可能。它看起來像這樣:
public class Calculator {
    public static void main(String... sss) {
        Calculator calculator = new Calculator();
        int sum = calculator.sum(1,10,123,234,6234,12,8);
    }
    int sum(int... numbers){
       return Arrays.stream(numbers).sum();
    }
}
那麼,我們來總結一下。Varargs 是可變長度參數,這是 Java 5 發佈時出現的功能。接下來,我們將仔細研究使用 Varargs 的一些規則。

5 條可變參數規則

規則 1. Vararg 參數(或可變/任意長度參數)由省略號指示,如下所示:
String... words
Integer... numbers
Person... people
Cat... cats
規則 2.任意長度的參數只能指定為某方法的參數:
void print(String... words)
int sum(Integer... numbers)
void save(Person... people)
void feed(Cat... cats)
規則 3.方法主體中的每個此類可變長度參數都是一個陣列:
void print(String... words){
    for (int i = 0; i < words.length; i++) {
        System.out.println(words[i]);
    }
}
規則 4. Vararg 參數必須是方法參數清單中的最後一個:
void print(String... words, String anotherWord) // - Так нельзя!
void print(String... words, int someNumber) // - Так нельзя!

void print(String anotherWord, String... words) // - Так можно
void print(int someNumber, String... words) // - Так можно
規則 5:儘管 varargs 是數組,但在呼叫採用可變長度參數的方法時,無需建立數組。簡單地列出用逗號分隔的所需參數就足夠了,甚至是可取的:
public class Main {
    public static void main(String... sss) {
        print("How","же","прекрасно","изучать","Java");
    }

    static void print(String... words){
        for (int i = 0; i < words.length; i++) {
            System.out.println(words[i]);
        }
    }
}

可變參數的範例

在下面的範例中,我們將編寫一個方法,該方法採用由整數組成的可變參數並顯示傳遞的元素數量及其總和。讓我們將數組和一系列整數傳遞給此方法(兩個選項都有效):
public static void main(String... sss) {
    int[] a = new int[100];
    for (int i = 0; i < a.length; i++) {
        a[i] = i;
    }

    sum(a);
    sum(1,2,3,4,5,6,7,8,9,10);
}

static void sum(int... numbers){
    final int length = numbers.length;
    final int sum = Arrays.stream(numbers).sum();
    final String lineSeparator = System.lineSeparator();

    System.out.printf("Кол-во элементов для сложения - %d, сумма - %d%s", length, sum, lineSeparator);
}
程式運行後會輸出:

Кол-во элементов для сложения - 100, сумма - 4950 
Кол-во элементов для сложения - 10, сумма - 55 
值得一提的是,該方法System.out.printf也接受可變參數。如果我們查看這個方法的程式碼,我們會看到:
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
另一種廣泛使用的接受 varags 的方法是String.format. 其程式碼如下所示:
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

何時使用可變參數?

這個問題的答案取決於提出問題的人。如果某個具有可變參數方法的 API 的客戶端提出類似的問題,那麼答案將是「盡可能頻繁地使用此類方法」。對於程式碼用戶端來說,可變參數使程式碼更容易編寫、更具可讀性,從而使生活變得更加輕鬆。但是,如果 API 開發人員問這個問題,並且想知道應該多久使用 varargs 建立方法,那麼答案將是「您不應該經常使用 varargs」。僅當使用 Varargs 的好處顯而易見時才應使用它。您還應該避免使用可變參數重載方法,因為這將使程式碼的用戶端很難理解實際呼叫了哪個重載方法。

結論

所以,我們討論了另一個主題,Java 中的可變參數。我們知道它是什麼了。我們描述了使用可變參數的規則。我們研究了具有任意長度參數的方法的範例,並討論了何時最好使用可變參數以及何時最好避免使用它們。作為作業,您可以實作以下方法:
  • 編寫void一個方法,該方法接受一系列整數並傳回它們的算術平均值。
  • 編寫void一個方法,接受一系列字串並列印最長的單字。
  • 寫一個方法,返回boolean並接受一個類型變數作為第一個參數String,一系列boolean變數長度作為下一個參數。
    可能的String值為AND, OR, XOR。如果第一個參數具有其他值,則該方法必須拋出異常IllegalArgumentException
    此方法必須對 varargs 參數的每個元素執行邏輯運算(在第一個參數中指定)並傳回計算結果。
範例參數和結果:
  • "AND", 真, true, false - 將會回傳 false
  • “OR”, false, true, false, false - 將傳回 true
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION