Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java Stream将一串数字解析为整数对象列表_Java_Parsing_Java Stream_Boxing - Fatal编程技术网

使用Java Stream将一串数字解析为整数对象列表

使用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

我的问题受到了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 ) ).collect( Collectors.toList() );
这在使用最新Java版本的新
var
功能时运行

System.out.println( x.getClass() );
System.out.println( x );
类java.util.ArrayList

[1,2,3,4,5]

我有两个问题:

  • 为什么
    x
    报告为
    ArrayList
    但我不能将
    x
    声明为ArrayList(错误:不兼容的类型),例如:
    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(" ")));