将由空格分隔的字符串在一行内转换为整数的ArrayList

3
我有一个字符串"5 12 4",我想把它转换成只用一行代码就可以将5、12和4存储在一个ArrayList中的整数列表。
我认为可以通过结合split(" "),将其转换成stream,使用mapToInt(s->Integers.parseInt(s))collect(Collectors.toList())来实现。大致如下:
ArrayList<Integer> nextLine = Arrays.stream(inputLine.split(" "))
.mapToInt(s->Integer.parseInt(s))
.collect(Collectors.toList());

但这种方式行不通,因为mapToInt会给我返回int而不是Integer

我知道如何使用循环来解决这个问题。如果有单个流操作的解决方案,我希望能够了解它。

2个回答

4
你可以使用 Integer#valueOf。请注意,你应该使用 Stream#map而不是 Steam#mapToInt
List<Integer> nextLine = 
    Arrays.stream(inputLine.split(" "))
          .map(Integer::valueOf)
          .collect(Collectors.toList());

是的,这个可以,谢谢。一旦SO允许,我会接受它。 - jimboweb

3
mapToInt 返回一个 IntStream,你不能将基本类型元素累加到一个 ArrayList<T> 中,因此你可以利用 map 操作,它会产生一个 Stream<Integer>,然后你可以将这些元素累加到一个 ArrayList<T> 中。

即使你将 .mapToInt(s -> Integer.parseInt(s)) 修改为 .map(s -> Integer.parseInt(s)),你的代码仍无法编译,因为结果的接收器类型是 ArrayList<Integer>,而在这种特定情况下,collect 终止操作将返回一个 List<Integer>

因此,要解决剩余的问题,你可以将接收器类型设置为 List<Integer>,或者保留接收器类型,然后执行 .collect(Collectors.toCollection(ArrayList::new)); 进行规约操作以获得特定的 List 实现。

已发布答案的另一种变体如下:

ArrayList<Integer> resultSet =
       Pattern.compile(" ")
              .splitAsStream(inputLine)
              .map(Integer::valueOf)
              .collect(Collectors.toCollection(ArrayList::new));

2
这种变量的优势在于它不会创建一个你不会使用的中间数组。+1 - fps
@FedericoPeraltaSchaffner 没错,你也可以使用 \\s - Eugene
@Eugene String.split 也支持 "\\s" - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接