【问题标题】:Java 8 Streams parsing to IntegerJava 8 Streams 解析为整数
【发布时间】:2017-06-25 11:52:14
【问题描述】:

使用流将字符串解析为整数是否存在比这更好的方法:

 String line = "1 2 3 4 5";
List<Integer> elements = Arrays.stream(line.split(" ")).mapToInt(x -> Integer.parseInt(x))
    .boxed().collect(Collectors.toList());

【问题讨论】:

  • 您是否 100% 确定输入字符串包含空格分隔的内容,每个内容都可以解析为 int?万一失败了怎么办?那应该怎么办?

标签: java java-8 java-stream


【解决方案1】:

如果将String直接解析为Integer,则可以省去一步:

String line = "1 2 3 4 5";
List<Integer> elements = Arrays.stream(line.split(" ")).map(Integer::valueOf)
    .collect(Collectors.toList());

或者您可以坚持使用原始类型,通过创建int 数组而不是List&lt;Integer&gt; 来提供更好的性能:

int[] elements = Arrays.stream(line.split(" ")).mapToInt(Integer::parseInt).toArray ();

你也可以替换

Arrays.stream(line.split(" "))

Pattern.compile(" ").splitAsStream(line)

不过,我不确定哪个更有效。

【讨论】:

    【解决方案2】:

    从 java-9 开始,通过Scanner#findAll 可以使用另一种方法:

    int[] result = scan.findAll(Pattern.compile("\\d+"))
                       .map(MatchResult::group)
                       .mapToInt(Integer::parseInt)
                       .toArray();
    

    【讨论】:

    • 嗨尤金!我已经看到您使用相同的方法至少回答了一个类似的问题。您能否解释一下为什么需要在返回的流中使用map(MatchResult::group)?我的意思是,我知道我可以去看文档并找出答案,但如果你稍微解释一下这种方法,也许对未来的读者来说会更好。谢谢!
    • 我看不到解析包含空格分隔整数的行的位置。你可以让扫描仪读取字符串吗?
    • @FedericoPeraltaSchaffner 这是正则表达式中的第一个匹配组...索引为0。这就是您使用group() 时得到的结果。如果您需要另一个组,您只需使用group(n)。随时欢迎您
    • @tucuxi 这是获取这些数字的另一种方式,不是通过拆分,而是通过获取所有连续数字
    猜你喜欢
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2021-04-25
    • 2014-05-19
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多