字符串到ArrayList <long>

时间:2017-07-14 23:28:21

标签: java java-stream

目前我有:

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来做?

编辑:复制到原始字符串错误

3 个答案:

答案 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