Могу ли я преобразовать строку в список с типом c? - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь написать функцию, которая разделяет строку разделителем, а затем возвращает список значений обобщенного типа c, полученного из разделенных сегментов.

public static <T> List<T> splitToList(String toParse, String delimiter, Class<T> cls) {
    String[] values = toParse.split(delimiter);
    List<T> list = new ArrayList<>();
    for(int i = 0; i < values.length; i++) {
        list.add(cls.cast(values[i]));
    }
    return list;
}

Мой код не работает для cls = Integer.class. Я что-то не так делаю?

1 Ответ

2 голосов
/ 04 марта 2020

Вы не можете в общем приводить java String s к любому виду POJO. Вы должны определить, как строки «разбираются» на объекты. Если вам нужен обобщенный список c, вам необходим метод синтаксического анализа generi c. Я бы предложил следующее:

public static <T> List<T> splitParseToList(String input, String delimiter, Function<String, T> parser) {
    String[] segments = StringUtils.split(input, delimiter);
    List<T> result = new ArrayList<>();
    for (String segment : segments) {
        String unparsed = StringUtils.strip(segment);
        // This is the step you missed (The conversion from String to 'actual' object):
        T value = parser.apply(unparsed);
        result.add(value);
    }
    return result;
}

Это позволяет вам указать функцию синтаксического анализа для преобразования строк во что-то еще:

String test = "1, 2, 4, 8";
List<Integer> list = splitParseToList(test, ",", Integer::parseInt);
System.out.println(list);

Я использовал apache StringUtils здесь. Это открытый исходный код.

Имейте в виду, что этот метод не устойчив к «плохому вводу». Я оставлю это на ваше усмотрение, чтобы обеспечить обработку ввода по вашему желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...