Подтвердить что ты не робот

Преобразовать список <String> в список <Integer> напрямую

После разбора моего файла s содержит AttributeGet:1,16,10106,10111

Поэтому мне нужно получить все числа после запятой в списке attributeIDGet. Я знаю, что есть несколько способов сделать это. Но есть ли способ Непременно конвертировать List<String> в List<Integer>. Поскольку нижеприведенный код жалуется на несоответствие типов, поэтому я попытался выполнить Integer.parseInt, но, похоже, это не сработает для List. Здесь s - String.

private static List<Integer> attributeIDGet = new ArrayList<Integer>();;

if(s.contains("AttributeGet:")) {
    attributeIDGet = Arrays.asList(s.split(":")[1].split(","));
}
4b9b3361

Ответ 1

Нет, вам нужно перебрать массив

for(String s : strList) intList.add(Integer.valueOf(s));

Ответ 2

Использование Java8:

stringList.stream().map(Integer::parseInt).collect(Collectors.toList());

Ответ 3

Конвертеры Guava делают трюк.

import com.google.common.base.Splitter;
import com.google.common.primitives.Longs;

final Iterable<Long> longIds = 
    Longs.stringConverter().convertAll(
        Splitter.on(',').trimResults().omitEmptyStrings()
            .splitToList("1,2,3"));

Ответ 4

Использование лямбда:

strList.stream().map(org.apache.commons.lang3.math.NumberUtils::toInt).collect(Collectors.toList());

Ответ 5

Нет, вам придется перебирать каждый элемент:

for(String number : numbers) {
   numberList.add(Integer.parseInt(number)); 
}

Причина этого заключается в том, что нет простого способа конвертировать список одного типа в любой другой тип. Некоторые преобразования невозможны или должны выполняться определенным образом. По сути, преобразование зависит от задействованных объектов и контекста преобразования, поэтому нет решения "один размер подходит всем". Например, что, если у вас есть объект Car и объект Person. Вы не можете преобразовать List<Car> в List<Person> напрямую, так как это действительно не имеет смысла.

Ответ 6

Если вы используете Google Guava library, это то, что вы можете сделать, см. Списки # transform

    String s = "AttributeGet:1,16,10106,10111";


    List<Integer> attributeIDGet = new ArrayList<Integer>();

    if(s.contains("AttributeGet:")) {
        List<String> attributeIDGetS = Arrays.asList(s.split(":")[1].split(","));
        attributeIDGet =
        Lists.transform(attributeIDGetS, new Function<String, Integer>() {
            public Integer apply(String e) {
                return Integer.parseInt(e);
            };
        });
    }

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

Ответ 7

Почему бы вам не использовать поток для преобразования списка строк в список целых чисел? как ниже

List<String> stringList = new ArrayList<String>(Arrays.asList("10", "30", "40",
            "50", "60", "70"));
List<Integer> integerList = stringList.stream()
            .map(Integer::valueOf).collect(Collectors.toList());

полная операция может быть чем-то вроде этого

String s = "AttributeGet:1,16,10106,10111";
List<Integer> integerList = (s.startsWith("AttributeGet:")) ?
    Arrays.asList(s.replace("AttributeGet:", "").split(","))
    .stream().map(Integer::valueOf).collect(Collectors.toList())
    : new ArrayList<Integer>();

Ответ 8

Если вам разрешено использовать lambdas из Java 8, вы можете использовать следующий пример кода.

final String text = "1:2:3:4:5";
final List<Integer> list = Arrays.asList(text.split(":")).stream()
  .map(s -> Integer.parseInt(s))
  .collect(Collectors.toList());
System.out.println(list);

Использование внешних библиотек. Обычный старый новый Java!

Ответ 9

Нет, нет способа (что я знаю) сделать это на Java.

В основном вам придется преобразовать каждую запись из String в Integer.

То, что вы ищете, может быть достигнуто на более функциональном языке, где вы можете передать функцию преобразования и применить ее ко всем элементам списка... но это невозможно (это будет применяться к каждому элементу в списке).

Overkill:

Однако вы можете использовать функцию из Google Guava (http://docs.guava-libraries.googlecode.com/ git/javadoc/com/google/common/base/Function.html), чтобы имитировать более функциональный подход, если это то, что вы ищете.

Если вы беспокоитесь об итерации по списку дважды, то вместо разделения используйте Tokenizer и преобразуйте каждый целочисленный токен в Integer перед добавлением в список.

Ответ 10

Вы можете использовать Lambda-функции Java 8 для достижения этого без цикла

    String string = "1, 2, 3, 4";
    List<Integer> list = Arrays.asList(string.split(",")).stream().map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList());

Ответ 11

Вот еще один пример, чтобы показать силу Гуавы. Хотя, это не так, как я пишу код, я хотел собрать все это вместе, чтобы показать, какое функциональное программирование Guava предоставляет Java.

Function<String, Integer> strToInt=new Function<String, Integer>() {
    public Integer apply(String e) {
         return Integer.parseInt(e);
    }
};
String s = "AttributeGet:1,16,10106,10111";

List<Integer> attributeIDGet =(s.contains("AttributeGet:"))?
  FluentIterable
   .from(Iterables.skip(Splitter.on(CharMatcher.anyOf(";,")).split(s)), 1))
   .transform(strToInt)
   .toImmutableList():
   new ArrayList<Integer>();