Во-первых, ваш Stream
является необработанным.Использование необработанного типа означает, что все, что использует параметр типа, стирается до его верхней границы, здесь Object
.Таким образом, map
возвращает еще один необработанный Stream
, а collect
возвращает Object
.Легкое исправление: Stream<String>
.
Stream<String> stream = Arrays.stream( input.split( " " ) );
Секунда, Collectors.toList
указано для возврата List<T>
или List<String>
здесь.
Нет никаких гарантий относительно типа, изменчивости, сериализуемости или безопасности потоков возвращаемого List
;если требуется больший контроль над возвращаемым List
, используйте toCollection(Supplier)
.
Если вы не удовлетворены List
и вам абсолютно необходим ArrayList
, укажите один:
.collect(Collectors.toCollection(ArrayList::new));
Кстати, вы можете заменить лямбда-выражение
s -> Integer.valueOf( ( String ) s )
ссылкой на метод
Integer::valueOf
После этих изменений ваш код может выглядеть следующим образом:
String input = "1 2 3 4 5";
Stream< String > stream = Arrays.stream( input.split( " " ) );
List< Integer > x = stream.map( Integer::valueOf ).collect( Collectors.toList() );
Или, если вы настаиваете на точном ArrayList
, а не List
, сделайте следующее:
String input = "1 2 3 4 5";
Stream< String > stream = Arrays.stream( input.split( " " ) );
ArrayList< Integer > x = stream.map( Integer::valueOf ).collect( Collectors.toCollection( ArrayList::new ) );
После внесения этих изменений это выглядит как достаточно хороший способ преобразованиястрока, содержащая целые числа через пробел в ArrayList<Integer>
.Незначительным улучшением было бы изменение аргумента регулярного выражения split
на "\\s+"
, чтобы представлять один или несколько пробельных символов.В случае поступления "1 2"
с несколькими пробелами между числами это предотвратит пустые строки, которые будут совпадать между пробелами.