2010-05-13 22 views
2

假設你有一個Java方法傳遞T和一個Java T []的混合可變參數方法

void foobar(int id, String ... args) 

,並希望這兩個字符串數組和字符串傳遞到方法。像這樣

String arr1[]={"adas", "adasda"}; 
String arr2[]={"adas", "adasda"}; 
foobar(0, "adsa", "asdas"); 
foobar(1, arr1); 
foobar(2, arr1, arr2); 
foobar(3, arr1, "asdas", arr2); 

在Python中有這個「*」。是否有某種方式比這樣比較難看的輔助方法,更好:

static String[] concat(Object... args) { 
    List<String> result = new ArrayList<String>(); 
    for (Object arg : args) { 
     if (arg instanceof String) { 
      String s = (String) arg; 
      result.add(s); 
     } else if (arg.getClass().isArray() && arg.getClass().getComponentType().equals(String.class)) { 
      String arr[] = (String[]) arg; 
      for (String s : arr) { 
       result.add(s); 
      } 
     } else { 
      throw new RuntimeException(); 
     } 
    } 
    return result.toArray(new String[result.size()]); 
} 

允許

foobar(4, concat(arr1, "asdas", arr2)); 

回答

3

Java沒有任何內置的語法糖這一點,但您的輔助方法,可能是一個要好很多:

private static String[] concat(Object... stringOrArrays) { 
    List<String> result = new ArrayList<String>(); 
    for (Object stringOrArray : stringOrArrays) { 
     if (stringOrArray instanceof String) { 
      result.add((String) stringOrArray); 
     } else if (stringOrArray instanceof String[]) { 
      Collections.addAll(result, (String[]) stringOrArray); 
     } else if (stringOrArray == null) { 
      results.add(null) 
     } else { 
      throw new RuntimeException(stringOrArray + " not a String or String[]"); 
     } 
    } 
    return result.toArray(new String[0]); 
} 

我能想出一個襯裏(避免方法),但我不建議這樣做:

foobar(1, new ArrayList<String>() {{ 
     addAll(Arrays.asList(arr1)); 
     addAll(Arrays.asList(arr2)); 
     add(arr3); 
    }}.toArray(new String[0])); 

單線的唯一優點是類型安全。

相關問題