Вы можете создать вспомогательные методы, которые будут преобразовывать список (массив) типа T
в список (массив) типа, U
используя map
операцию on stream
.
//for lists
public static <T, U> List<U> convertList(List<T> from, Function<T, U> func) {
return from.stream().map(func).collect(Collectors.toList());
}
//for arrays
public static <T, U> U[] convertArray(T[] from,
Function<T, U> func,
IntFunction<U[]> generator) {
return Arrays.stream(from).map(func).toArray(generator);
}
И используйте это так:
//for lists
List<String> stringList = Arrays.asList("1","2","3");
List<Integer> integerList = convertList(stringList, s -> Integer.parseInt(s));
//for arrays
String[] stringArr = {"1","2","3"};
Double[] doubleArr = convertArray(stringArr, Double::parseDouble, Double[]::new);
Обратите внимание, что
s -> Integer.parseInt(s)
его можно заменить на
Integer::parseInt
(см.
Ссылки на методы )
Lists.transform()
.источник
Вспомогательные методы из принятого ответа не нужны. Потоки можно использовать с лямбда-выражениями или обычно сокращать с помощью ссылок на методы . Потоки позволяют выполнять функциональные операции.
map()
преобразует элементы и /collect(...)
илиtoArray()
возвращает поток обратно в массив или коллекцию.Выступление Венката Субраманиама (видео) объясняет это лучше, чем я.
1 преобразовать
List<String>
вList<Integer>
2 преобразовать
List<String>
вint[]
3 преобразовать
String[]
вList<Integer>
4 преобразовать
String[]
вint[]
5 преобразовать
String[]
вList<Double>
6 (бонус) Конвертировать
int[]
вString[]
Конечно, возможны и другие варианты.
Также см. Версию Ideone этих примеров . Можно нажать fork, а затем запустить для запуска в браузере.
источник
EDIT: как указано в комментариях, это гораздо более простая версия:
Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
таким образом мы можем пропустить все преобразование в список и из него.Я нашел еще одно однострочное решение, но оно все еще довольно медленное (занимает примерно в 100 раз больше, чем цикл for - проверено на массиве из 6000 0)
Что это значит:
источник
Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
Для списка:
Для массива:
источник
Вы также можете использовать,
источник
Я не нашел этого в предыдущих ответах, поэтому с Java 8 и потоками:
Преобразовать
String[]
вInteger[]
:источник
Дополнительно - контроль отсутствия элементов в строковом массиве:
источник
Я использовал maptoInt () с операцией Lambda для преобразования строки в Integer
источник
Arrays.toString (int []) работает для меня.
источник