Ответ 1
Нет, вам нужно перебрать массив
for(String s : strList) intList.add(Integer.valueOf(s));
После разбора моего файла 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(","));
}
Нет, вам нужно перебрать массив
for(String s : strList) intList.add(Integer.valueOf(s));
Использование Java8:
stringList.stream().map(Integer::parseInt).collect(Collectors.toList());
Конвертеры 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"));
Использование лямбда:
strList.stream().map(org.apache.commons.lang3.math.NumberUtils::toInt).collect(Collectors.toList());
Нет, вам придется перебирать каждый элемент:
for(String number : numbers) {
numberList.add(Integer.parseInt(number));
}
Причина этого заключается в том, что нет простого способа конвертировать список одного типа в любой другой тип. Некоторые преобразования невозможны или должны выполняться определенным образом. По сути, преобразование зависит от задействованных объектов и контекста преобразования, поэтому нет решения "один размер подходит всем". Например, что, если у вас есть объект Car
и объект Person
. Вы не можете преобразовать List<Car>
в List<Person>
напрямую, так как это действительно не имеет смысла.
Если вы используете 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);
};
});
}
Да, согласитесь с вышеприведенным ответом, что он раздутый, но стильный. Но это еще один способ.
Почему бы вам не использовать поток для преобразования списка строк в список целых чисел? как ниже
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>();
Если вам разрешено использовать 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!
Нет, нет способа (что я знаю) сделать это на Java.
В основном вам придется преобразовать каждую запись из String в Integer.
То, что вы ищете, может быть достигнуто на более функциональном языке, где вы можете передать функцию преобразования и применить ее ко всем элементам списка... но это невозможно (это будет применяться к каждому элементу в списке).
Overkill:
Однако вы можете использовать функцию из Google Guava (http://docs.guava-libraries.googlecode.com/ git/javadoc/com/google/common/base/Function.html), чтобы имитировать более функциональный подход, если это то, что вы ищете.
Если вы беспокоитесь об итерации по списку дважды, то вместо разделения используйте Tokenizer и преобразуйте каждый целочисленный токен в Integer перед добавлением в список.
Вы можете использовать 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());
Вот еще один пример, чтобы показать силу Гуавы. Хотя, это не так, как я пишу код, я хотел собрать все это вместе, чтобы показать, какое функциональное программирование 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>();