目前我有:
String a = "123.5950,555,5973.1,6321.905,6411.810000000001,6591.855"
我可以将它转换为字符串的数组列表,然后转换为Longs的数组列表:
ArrayList<String> vals = new ArrayList<String>(Arrays.asList(a.split(","));
ArrayList<Long> longs = new ArrayList<>();
for(String ks : vals){
longs.add(Long.parseLong(ks));
}
我尝试使用Stream
执行此操作,以使其更加有趣&#39;但似乎不能成功:
ArrayList<Long> longs = a.stream().map(Long::parseLong).collect(Collectors.toList());
我不认为for循环非常优雅,我怎么能用Stream
来做?
编辑:复制到原始字符串错误
答案 0 :(得分:10)
您需要根据String.split
:
final List<Long> longs = Arrays
.stream(a.split(","))
.map(Long::parseLong)
.collect(Collectors.toList());
此外,Collectors.toList()
将返回List
接口,而不是具体实现ArrayList
。
如果你真的需要一个数组列表,你需要复制它:
new ArrayList<>(longs);
编辑:
正如@shmosel指出的那样,您可以使用Collectors.toCollection(ArrayList::new)
答案 1 :(得分:4)
如果不将String
分开,则无法对其进行流式传输。分裂为流的两种方法:
Arrays.stream(a.split(","))
或
Pattern.compile(",").splitAsStream(a)
除此之外,collect(Collectors.toList())
还会返回List
,而非ArrayList
。而且我不确定为什么你期望parseLong()
能够处理这些字符串。
答案 2 :(得分:1)
String a = "123.5950.555,5973.1,6321.905,6411.810000000001,6591.855";
List<Double> doubleList = Arrays.stream(a.split(","))
.map(Doubles::tryParse)
.collect(Collectors.toList());
System.out.println(doubleList);
注意:这使用了来自Guava的Doubles#tryParse
。