2010-05-13 5 views
2

당신이 자바 방법을전달 혼합 방법

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); 

파이썬에는 "*"가 있습니다. 이러한 오히려 못생긴 도우미 방법보다 더 나은 몇 가지 방법이있다 :

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
자바는 이것에 대한 문법적를 내장하고 있지 않지만, 도우미 방법은 많은 친절하게 대할 수

:

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])); 

한 라이너의 유일한 이점은 유형 안전입니다.