2013-08-02 3 views
1

Я получаю строку констант в List<String>. Мне нужно List<Integer>. Основным способом, Я буду перебирать и отливать в Integer.Как преобразовать Список <String> в список <Integer>?

Есть ли лучшее решение?

Позвольте мне объяснить сценарий

Я использую JSF. Вы найдете здесь аналогичную проблему How to convert String into Integer in h:selectOneMenu

SelectOneMenu всегда дает вам строку. Я должен взять всю выбранную строку и встать в SQL IN , что фактически относится к числовому полю.

Вот почему я ищу решение, которое может свести к минимуму цикл.

+0

Какие константы? '' 123 "', что-то вроде этого? –

+0

Я боюсь, что вам нужно создать новый список и проанализировать и добавить каждый элемент в новый список. – user902383

+0

Никогда не слышал, что есть какое-либо * лучшее * (что бы ни было * лучше * означает). – m0skit0

ответ

8

Нет, другого пути нет.

Но отливка в этом случае невозможна, вам необходимо использовать Integer.parseInt(stringValue).

List<String> listStrings = ... 
List<Integer> listIntegers = new ArrayList<Integer>(listStrings.size()); 
for(String current:listStrings){ 
    listIntegers.add(Integer.parseInt(current)); 
} 
+0

Можем ли мы так использовать? сначала назначьте List list = listStrings после этого списка назначить в список . – rish

+0

Вы попробовали? – f1sh

+0

да, я сделал и его рабочий штраф – rish

0

Не существует явного и прямого способа изменить параметризованный тип коллекции. Вы должны создать еще один и перенести данные при его изменении.

0

В обратном направлении уже есть answered.

Похоже, что петля является единственным вариантом. Если вы не хотите «зацикливаться», есть некоторые классы, которые можно использовать (например, из Apache Commons).

0

Это не просто вопрос литья, потому что String и Integer - принципиально разные объекты.

Вы должны перебрать список и проанализировать каждый из Int новый Integer:

Listy<Integer> intList = new ArrayList<Integer>(); 
for(String numeric : stringList) 
{ 
    intList.add(Integer.parseInt(numeric)); 
} 
6

Существует способ сделать это.

Вы можете использовать Adapter Pattern и создать класс, который implements List<Integer>, но внутренне обращается к вашему List<String>, задавая значения между Integer и String. Пока вы выполняете все контракты, любой API, который требует List<Integer>, сможет работать с этим классом, как с родным List<Integer>.

Это может показаться громоздким и неэффективным, но когда вам необходимо передать List<Integer> API, который только обращается к некоторым значениям списка, более эффективно использовать некоторые из них по требованию («ленивая оценка») вместо того, чтобы бросать их всех. Он также сохраняет память, потому что одновременно не будет отображаться как целое, так и целочисленное представление всего вашего списка в памяти.

+0

Вы думаете о шаблонах. Мне нравится это. – f1sh

+0

Это творческий ответ, который на самом деле делает этот вопрос стоящим :) – bjedrzejewski

+0

Требуется много работы, но в итоге это будет действительно красиво –

1
for(String str : listOfString) { 
    listOfInteger.add(Integer.valueOf(str)); 
} 

Нет прямого способа сделать это.

0

Посмотрите на Google Guava's Lists класса, вы можете сделать что-то как:

List<Integer> result = Lists.transform(stringList, new Function<String, Integer>() { 
    @Override 
    public Integer apply(@Nullable String input) { 
     return Integer.parsInt(input) 
    } 
}); 

Насколько я помню, он преобразует каждый элемент лениво.

0

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

List<String> strings = Lists.newArrayList("1", "2", "3"); 
List<Integer> ints = Lists.transform(strings, new Function<String, Integer>(){ 
    public Integer apply(String input) { 
     return Integer.valueOf(input); 
    } 
}); 
+0

Или для Guava 16.0+: 'new ArrayList <> (Lists.transform (listOfStrings, Longs.stringConverter())) ' – LateralFractal

Смежные вопросы