说我有字符串"5 12 4"
。我想把它变成一个ArrayList
整数,在一个功能行中包含5,12和4。
我认为应该有一种方法可以通过组合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
s。
我知道如何使用循环来完成它。如果存在的话,我想在单个流操作中实现它。
答案 0 :(得分:4)
您可以使用Integer#valueOf
。请注意,您应该使用hpc<-read.table("hpc.txt", skip = 66637, nrow = 2879, sep =";")
hpc$Time<-strptime(hpc$Time, format = "%H:%M:%S")
hpc$Date<-as.Date(hpc$Date, format = "%d/%m/%Y")
with(hpc,plot(Time,Global.active.power, ylab = "Global.active.power(Killowatts)",
xlab = "",type = "l"))
而不是Stream#map
:
Steam#mapToInt
答案 1 :(得分: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));