Java/Language Basics/Varargs

Материал из Java эксперт
Перейти к: навигация, поиск

Convert varargs to an array

   <source lang="java">

public class Main {

 public static void main(String[] args) {
   printMessage("H", "Y", ", ", "how ", "are ", "you", "?");
 }
 public static void printMessage(String... messages) {
   String[] copiedMessage = messages;
   for (int i = 0; i < messages.length; i++) {
     System.out.print(copiedMessage[i]);
   }
 }

}

 </source>
   
  
 
  



Create a method that accept varargs in Java

   <source lang="java">
 

public class Main {

 public static void main(String[] args) {
   printParams(1, 2, 3);
   printParams(10, 20, 30, 40, 50);
   printParams(100, 200, 300, 400, 500);
 }
 public static void printParams(int... numbers) {
   for (int number : numbers) {
     System.out.println(number + ", ");
   }
 }

}


 </source>
   
  
 
  



Demonstrate variable length arguments.

   <source lang="java">
 

public class VarArgs {

 static void vaTest(int... v) {
   System.out.print("Number of args: " + v.length + " Contents: ");
   for (int x : v)
     System.out.print(x + " ");
   System.out.println();
 }
 public static void main(String args[]) {
   // vaTest() can be called with a variable number of arguments.
   vaTest(10); // 1 arg
   vaTest(1, 2, 3); // 3 args
   vaTest(); // no args
 }

}


 </source>
   
  
 
  



Java enum and varargs

   <source lang="java">
 

/* License for Java 1.5 "Tiger": A Developer"s Notebook

    (O"Reilly) example package

Java 1.5 "Tiger": A Developer"s Notebook (O"Reilly) by Brett McLaughlin and David Flanagan. ISBN: 0-596-00738-8 You can use the examples and the source code any way you want, but please include a reference to where it comes from if you use it in your own products or services. Also note that this software is provided by the author "as is", with no expressed or implied warranties. In no event shall the author be liable for any direct or indirect damages arising in any way out of the use of this software.

  • /

import java.util.List; enum GuitarInlay {

 NO_INLAY,
 DIAMONDS_AND_SQUARES,
 DOTS,
 TINY_DOTS,
 ABALONE_BORDER,
 ABALONE_ROSETTE

} enum GuitarWood {

 MAHOGANY,
 INDIAN_ROSEWOOD,
 BRAZILIAN_ROSEWOOD,
 MADAGASCAR_ROSEWOOD,
 ZIRICOTE,
 BUBINGA,
 KOA,
 
 ADIRONDACK,
 SITKA,
 CEDAR,
 REDWOOD

} public class Guitar {

 private String builder;
 private String model;
 private float nutWidth;
 private GuitarWood backSidesWood;
 private GuitarWood topWood;
 private GuitarInlay fretboardInlay;
 private GuitarInlay topInlay;
 private List features;
 private static final float DEFAULT_NUT_WIDTH = 1.6875f;
 public Guitar(String builder, String model, String... features) {
   this(builder, model, null, null, DEFAULT_NUT_WIDTH, null, null, features);
 }
 public Guitar(String builder, String model, 
               GuitarWood backSidesWood, GuitarWood topWood,
               float nutWidth, String... features) {
   this(builder, model, backSidesWood, topWood, nutWidth, null, null, features);
 }
 public Guitar(String builder, String model, 
               GuitarWood backSidesWood, GuitarWood topWood,
               float nutWidth, 
               GuitarInlay fretboardInlay, GuitarInlay topInlay, 
               String... features) {
   this.builder = builder;
   this.model = model;
   this.backSidesWood = backSidesWood;
   this.topWood = topWood;
   this.nutWidth = nutWidth;
   this.fretboardInlay = fretboardInlay;
   this.topInlay = topInlay;
   this.features = java.util.Arrays.asList(features);
 }

}



 </source>
   
  
 
  



Java varargs: Iterating Over Variable Length Argument Lists

   <source lang="java">
 

/* License for Java 1.5 "Tiger": A Developer"s Notebook

    (O"Reilly) example package

Java 1.5 "Tiger": A Developer"s Notebook (O"Reilly) by Brett McLaughlin and David Flanagan. ISBN: 0-596-00738-8 You can use the examples and the source code any way you want, but please include a reference to where it comes from if you use it in your own products or services. Also note that this software is provided by the author "as is", with no expressed or implied warranties. In no event shall the author be liable for any direct or indirect damages arising in any way out of the use of this software.

  • /

public class MathUtils {

 public static int max(int... values) {
   if (values.length == 0) {
     throw new IllegalArgumentException("No values supplied.");
   }
   int max = Integer.MIN_VALUE;
   for (int i : values) {
     if (i > max)
       max = i;
   }
   return max;
 }

}


 </source>
   
  
 
  



Java Varargs Tester

   <source lang="java">
 

/* License for Java 1.5 "Tiger": A Developer"s Notebook

    (O"Reilly) example package

Java 1.5 "Tiger": A Developer"s Notebook (O"Reilly) by Brett McLaughlin and David Flanagan. ISBN: 0-596-00738-8 You can use the examples and the source code any way you want, but please include a reference to where it comes from if you use it in your own products or services. Also note that this software is provided by the author "as is", with no expressed or implied warranties. In no event shall the author be liable for any direct or indirect damages arising in any way out of the use of this software.

  • /

import java.io.IOException; import java.io.PrintStream; import java.util.LinkedList; import java.util.List; public class VarargsTester {

 public VarargsTester() {
 }
 private int[] getListOfNumbers() {
   int[] numbers = new int[] {0, 2, 4, 6, 8, 10, 9, 7, 5, 3, 1};
   return numbers;
 }
 private String print(Object... values) {
   StringBuilder sb = new StringBuilder();
   for (Object o : values) {
     sb.append(o.toString())
       .append(" ");
   }
   return sb.toString();
 }
 public void testMaxMethod(PrintStream out) throws IOException {
   int[] numbers = getListOfNumbers();
   int max = MathUtils.max(numbers);
   out.println("Max of list is: " + max);
 }
 public void testPrintMethod(PrintStream out) throws IOException {
   out.println(print("foo", 23, -12, 1.23, getListOfNumbers()));
 }
 public void testArrayArgs(PrintStream out) throws IOException {
   Object[] obj = new String[] {"Hello", "to", "all", "of", "you"};
   out.printf("%s\n", obj);
   out.printf("%s\n", (Object)obj);
 }
 public static void main(String[] args) {
   try {
     VarargsTester tester = new VarargsTester();
     tester.testMaxMethod(System.out);
     tester.testPrintMethod(System.out);
     tester.testArrayArgs(System.out);
   } catch (IOException e) {
     e.printStackTrace();
   }
 }

}


 </source>
   
  
 
  



New parameter for main method

   <source lang="java">

public class Main {

 public static void main(String... args) {
   for (String arg : args) {
     System.out.println(arg);
   }
 }

}

 </source>
   
  
 
  



Old style: Use an array to pass a variable number of arguments

   <source lang="java">
 

public class PassArray {

 static void vaTest(int v[]) {
   System.out.print("Number of args: " + v.length + " Contents: ");
   for (int x : v)
     System.out.print(x + " ");
   System.out.println();
 }
 public static void main(String args[]) {
   int n1[] = { 10 };
   int n2[] = { 1, 2, 3 };
   int n3[] = {};
   vaTest(n1); // 1 arg
   vaTest(n2); // 3 args
   vaTest(n3); // no args
 }

}


 </source>
   
  
 
  



Use varargs with standard arguments.

   <source lang="java">
 

public class VarArgs2 {

 static void vaTest(String msg, int... v) {
   System.out.print(msg + v.length + " Contents: ");
   for (int x : v)
     System.out.print(x + " ");
   System.out.println();
 }
 public static void main(String args[]) {
   vaTest("One vararg: ", 10);
   vaTest("Three varargs: ", 1, 2, 3);
   vaTest("No varargs: ");
 }

}



 </source>
   
  
 
  



Varargs and overloading.

   <source lang="java">
 

/* Java 2, v5.0 (Tiger) New Features by Herbert Schildt ISBN: 0072258543 Publisher: McGraw-Hill/Osborne, 2004

  • /

public class VarArgs3 {

 static void vaTest(int ... v) { 
   System.out.print("vaTest(int ...): " + "Number of args: " + v.length + 
                    " Contents: "); 

   for(int x : v) 
     System.out.print(x + " "); 

   System.out.println(); 
 } 

 static void vaTest(boolean ... v) { 
   System.out.print("vaTest(boolean ...) " + 
                    "Number of args: " + v.length + 
                    " Contents: "); 

   for(boolean x : v) 
     System.out.print(x + " "); 

   System.out.println(); 
 } 

 static void vaTest(String msg, int ... v) { 
   System.out.print("vaTest(String, int ...): " + 
                    msg + v.length + 
                    " Contents: "); 

   for(int x : v) 
     System.out.print(x + " "); 

   System.out.println(); 
 } 

 public static void main(String args[])  
 { 
   vaTest(1, 2, 3);  
   vaTest("Testing: ", 10, 20); 
   vaTest(true, false, false); 
 } 

}



 </source>
   
  
 
  



VarArgs Example

   <source lang="java">
 

public class VarArgsExample {

   int sumArrays(int[]... intArrays)
   {
       int sum, i, j;
       sum=0;
       for(i=0; i<intArrays.length; i++) {
           for(j=0; j<intArrays[i].length; j++) {
               sum += intArrays[i][j];
           }
       }
       return(sum);
   }
   public static void main(String args[])
   {
       VarArgsExample va = new VarArgsExample();
       int sum=0;
       sum = va.sumArrays(new int[]{1,2,3},
                          new int[]{4,5,6},
                          new int[]{100,200});
       System.out.println("The sum of the numbers is: " + sum);
   }

}


 </source>
   
  
 
  



Varargs, overloading, and ambiguity.

   <source lang="java">
 

public class VarArgs4 {

 static void vaTest(int... v) {
   System.out.print("vaTest(int ...): " + "Number of args: " + v.length + " Contents: ");
   for (int x : v)
     System.out.print(x + " ");
   System.out.println();
 }
 static void vaTest(boolean... v) {
   System.out.print("vaTest(boolean ...) " + "Number of args: " + v.length + " Contents: ");
   for (boolean x : v)
     System.out.print(x + " ");
   System.out.println();
 }
 public static void main(String args[]) {
   vaTest(1, 2, 3); // OK
   vaTest(true, false, false); // OK
   //vaTest(); // Error: Ambiguous!
 }

}



 </source>