假设我需要解析空格分隔的数字列表,其中某些列表包含整数,而某些列表包含双精度数。什么是推广以下函数以减少重复的好方法?我以为这可能是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;
}
答案 0 :(得分:4)
如果您使用某种功能(例如java.util.function.Function
或com.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]
}
当模式不变时,您也可以使模式保持不变。