使用Java Stream将一串数字解析为整数对象列表
我的问题受到了Java Streams的启发,但旨在使用Java Streams获得一个使用Java Stream将一串数字解析为整数对象列表,java,parsing,java-stream,boxing,Java,Parsing,Java Stream,Boxing,我的问题受到了Java Streams的启发,但旨在使用Java Streams获得一个列表 我有这样的代码。它似乎返回了一个ArrayList,大概是ArrayList。但是编译器拒绝让我这样声明结果 String input = "1 2 3 4 5"; Stream stream = Arrays.stream( input.split( " " ) ); var x = stream.map( s -> Integer.valueOf( ( String ) s ) ).colle
列表
我有这样的代码。它似乎返回了一个ArrayList
,大概是ArrayList
。但是编译器拒绝让我这样声明结果
String input = "1 2 3 4 5";
Stream stream = Arrays.stream( input.split( " " ) );
var x = stream.map( s -> Integer.valueOf( ( String ) s ) ).collect( Collectors.toList() );
这在使用最新Java版本的新var
功能时运行
System.out.println( x.getClass() );
System.out.println( x );
类java.util.ArrayList
[1,2,3,4,5]
我有两个问题:
- 为什么
报告为x
但我不能将ArrayList
声明为ArrayList(错误:不兼容的类型),例如:x
ArrayList x=stream.map(s->Integer.valueOf((String)s)).collect(collector.toList())代码>
- 是否有更好的方法使用streams将这一串数字转换为
整数的
列表
List List=Arrays.stream(“12345.split”(“”)).map(s->Integer.valueOf(s)).collect(Collectors.toList());
这是一份汇编。根据《圣经》:“没有关于类型、可变性的保证,
*返回的{@code List}的可序列化性或线程安全性;“首先,您的
流是原始的。使用原始类型意味着使用类型参数的任何内容都将被删除到其上限,即对象
。因此map
返回另一个原始流
,collect
返回一个对象
。轻松修复:流
顺便说一下,您可以替换lambda表达式
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
的一种相当好的方法。一个小的改进是将split
正则表达式参数更改为“\\s+”
,以表示一个或多个空白字符。如果“1 2”
到达,数字之间有多个空格,这将防止空格字符之间匹配的空字符串。您可以创建数组列表,但不应:
ArrayList<Integer> x =
stream.map(Integer::valueOf)
.collect(Collectors.toCollection(ArrayList::new));
为什么x报告为ArrayList,但我不能声明x为ArrayList
因为
collect(…)
根据collector.toList()的结果类型返回一个静态推断的类型李>
即(在本例中)收集器
。。。根据收集器
实际对象是ArrayList
这一事实是一个实现细节,可以想象在未来的Java版本中会发生变化
有没有更好的方法使用streams将这个数字字符串转换为整数列表
我会让其他人说。但是,我认为更简单/更干净的方法是不使用流来完成此任务
String input = "1 2 3 4 5";
var x = new ArrayList<>(Arrays.asList(input.split(" ")));
String input=“1 2 3 4 5”;
var x=新的ArrayList(Arrays.asList(input.split(“”));
上面的代码比我见过的基于流的版本更简单,效率也更高。你需要声明你的流stream
。当真正涉及数字处理时,你可以使用var x=input.chars().filter(c->c!=32.map(c->c-'0').boxed().collector(Collectors.toList())代码>不生成中间数组。将Arrays.stream(input.split(“”)替换为Pattern.compile(“”).splitAsStream(input)
@Andreas我很高兴看到您的建议在。但我重视这个答案,因为它保持了我原始代码的上下文,同时澄清和纠正了我的误解。@BasilBourque我想我应该把这个评论放在问题中,嗯。;-)
String input = "1 2 3 4 5";
Stream< String > stream = Arrays.stream( input.split( " " ) );
List< Integer > x = stream.map( Integer::valueOf ).collect( Collectors.toList() );
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> x =
stream.map(Integer::valueOf)
.collect(Collectors.toCollection(ArrayList::new));
List<Integer> x =
Arrays.stream(input.split(" "))
.map(Integer::valueOf)
.collect(Collectors.toList());
List<Integer> x =
Pattern.compile(" ").splitAsStream("1 2 3 4 5")
.map(Integer::valueOf)
.collect(Collectors.toList());
String input = "1 2 3 4 5";
var x = new ArrayList<>(Arrays.asList(input.split(" ")));