今天我們將討論 Java 中的 varargs 這樣的東西。Varargs(或可變參數)是一種允許您建立具有任意數量參數的方法的技術。在本文中,我們將學習如何建立此類方法,討論為什麼需要可變參數以及何時最好使用它們。
我們有兩個選擇。 選項 1 - 過載:
什麼是可變參數?
Varargs 是可變長度參數:JDK5 中出現的功能。可變參數允許我們建立具有任意數量參數的方法。總的來說,以前可以創建這樣的方法。確實,這樣做並不是很方便。讓我們舉個例子。假設我們需要編寫一個方法,該方法將採用任意數量的整數參數並將它們加在一起。![Java 可變參數 - 1](https://cdn.javarush.com/images/article/3975a4ce-681a-4b0f-879f-ca1961d3df93/800.jpeg)
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
GO TO FULL VERSION