Я пытаюсь написать общую функцию для генерации Object [] [] из матрицы, записанной в CSV-файле.
Я хотел бы знать, является ли то, что я написал, фиктивным в некотором смысле, так как я получить некоторые предупреждения о сотворении.
Вот мой путь:
Прочитайте CSV
String delimiter="\t";
List<String> data=Files.readAllLines("matrix.csv");
Функции для произнесения Строка, массив и двойной массив:
public static <T> Function<String, T> simpleCast(Class<T> type) {
Function<String, T> casting;
switch (type.getCanonicalName()) {
case "double":
case "java.lang.Double":
casting = s -> (T) Double.valueOf(s);
break;
case "int":
case "java.lang.Integer":
casting = s -> (T) Integer.valueOf(s);
break;
case "boolean":
case "java.lang.Boolean":
casting = s -> (T) Boolean.valueOf(s);
break;
case "float":
case "java.lang.Float":
casting = s -> (T) Float.valueOf(s);
break;
case "long":
case "java.lang.Long":
casting = s -> (T) Long.valueOf(s);
break;
default:
casting = type::cast;
break;
}
return casting;
}
public static <T> IntFunction<T[]> simpleArrayCast(Class<T> type) {
return i -> {
switch (type.getCanonicalName()) {
case "double":
return (T[]) new Double[i];
case "int":
return (T[]) new Integer[i];
case "boolean":
return (T[]) new Boolean[i];
case "float":
return (T[]) new Float[i];
case "long":
return (T[]) new Long[i];
default:
return (T[]) Array.newInstance(type, i);
}
};
}
public static <T> IntFunction<T[][]> doubleArrayCast(Class<T> type) {
Class<?> arrayType = Util.simpleArrayCast(type).apply(0).getClass();
return i -> (T[][]) Array.newInstance(arrayType, i);
}
Метод создания матрицы
public <T> T[][] toMatrix(List<String> data, Class<T> type) {
return data.stream()
.map(row -> Arrays.stream(row.split(delimiter, -1))
.map(s -> Util.simpleCast(type).apply(s))
.toArray(Util.simpleArrayCast(type))
).toArray(Util.doubleArrayCast(type));
}
Затем я могу сгенерировать матрица, как это.
MyClass[][] matrix=toMatrix(data, MyClass.class);
Единственное ограничение, которое я нахожу, заключается в том, что если я использую toMatrix (data, double.class), то я получаю Double [] [], который может быть несовместимо с некоторыми Apache математическими функциями.
Кроме того, мне интересно, действительно ли полезно использовать прямое приведение по умолчанию, поскольку оно будет работать в основном только для String и возвращать исключение ClassCastException для большинства из остальных?
Что вы думаете? Это безопасно? (конечно, если нет сведений о типе в файле).