Java:使用泛型进行字符串解析以改善干燥

时间:2016-03-29 15:25:22

标签: java generics

假设我需要解析空格分隔的数字列表,其中某些列表包含整数,而某些列表包含双精度数。什么是推广以下函数以减少重复的好方法?我以为这可能是Generics的一个很好的用例?

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

2 个答案:

答案 0 :(得分:4)

如果您使用某种功能(例如java.util.function.Functioncom.google.common.base.Function)并使用String并返回所需类型,则可以使用泛型执行此操作。

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

答案 1 :(得分: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]
}

当模式不变时,您也可以使模式保持不变。