2016-03-29 13 views
4

一部のリストに整数が含まれ、一部のリストに2重が含まれている場合、空白で区切られた数字のリストを解析する必要があると仮定します。繰り返しを減らすために次の関数を一般化する良い方法は何でしょうか?私はこれがジェネリックスの良いユースケースかもしれないと思っていましたか?あなたがStringを取り、希望のタイプを返す関数(例えばjava.util.function.Functionまたはcom.google.common.base.Function)のいくつかの並べ替えを持っている場合Java:文字列解析にジェネリックスを使用してDRYnessを改善する

public static ArrayList<Integer> stringToIntList(String str) 
{ 
    String[] strs = str.split("\\s"); 
    ArrayList<Integer> output = new ArrayList<Integer>(); 
​ 
​ 
    for (String val : strs) 
    { 
     output.add(Integer.parseInt(val)); 
    } 
​ 
    return output; 
} 
​ 
public static ArrayList<Double> stringToDoubleList(String str) 
{ 
    String[] strs = str.split("\\s"); 
    ArrayList<Double> output = new ArrayList<Double>(); 
​ 
​ 
    for (String val : strs) 
    { 
     output.add(Double.parseDouble(val)); 
    } 
​ 
    return output; 
} 

答えて

4

あなたはジェネリックでこれを行うことができます。

static <T> ArrayList<T> stringToList(
    String str, Function<? super String, ? extends T> fn) { 
    String[] strs = str.split("\\s"); 
    ArrayList<T> output = new ArrayList<>(); 
    for (String val : strs) 
    { 
     output.add(fn.apply(val)); 
    } 
    return output; 
} 
3

のJava 8で、それは非常に簡潔になります

static <T> List<T> convertToList(
     String string, Function<String, T> function) { 
    return Pattern.compile("\\s").splitAsStream(string) 
      .map(function).collect(Collectors.toList()); 
} 

public static void main(String[] args) { 
    String s = "3 4"; 
    System.out.println(convertToList(s,Double::parseDouble)); // [3.0, 4.0] 
    System.out.println(convertToList(s,Integer::parseInt)); // [3, 4] 
} 

あなたはそれが変化しない場合にもパターンを一定にすることができます。

+0

これを試してみると、関数が 'List 'ではなく 'List 'を返すというエラーが表示されます。そこにキャストが必要なのですか? –

+0

@ evan058どのように呼びますか? Tを返す関数を渡す必要がありますが、TがObjectの場合はリストを取得します user140547

+0

IntelliJを使用していて、IDEがそのエラーを投げています。私は関数を定義したばかりです:互換性のない型:必須: 'List '; 'List 'が見つかりました –

関連する問題