Java 如何将字符串化点流转换为 ArrayList<Point2D.Double>

Java How to convert a stream of stringified points to an ArrayList<Point2D.Double>

我有一个像上面这样的字符串化点流 Stream<String>

("1,2","1,3", "3,4")

我想将它们转换成 ArrayList<Point2D.Double>

我正在将它们转换为 Stream<DoubleStream>

Stream<DoubleStream> pointList = pointStrList.map(pointStr-> stream(pointStr.split(",")).mapToDouble(d->Double.valueOf(d)));
Stream<Point2D.Double> plist = pointList.map(val-> new Point2D.Double(val.toArray()[0], val.toArray()[1]));

但是当我尝试通过 dping 转换为 ArrayList<Point2D.Double> 时:

ArrayList<Point2D.Double> array = plist.map(val->val);

提示错误:

Required type: ArrayList<Double> 
Provided: Stream<Object>

我认为当您这样做时您的解决方案无法工作:

val-> new Point2D.Double(val.toArray()[0], val.toArray()[1])

val 是一个流,您尝试对其调用 toArray() 两次。这不适用于 Streams,当您第一次执行 val.toArray() 时,它会消耗 Stream,并且您不能再次使用该流,因此第二次您将遇到异常。 See here for further explanations

可以这样直接获取列表:

List<Point2D.Double> pointList = pointStrList
       .map(pointStr -> pointStr.split(","))
       .map(a -> new Double[] {Double.parseDouble(a[0]), Double.parseDouble(a[1])})
       .map(a -> new Point2D.Double(a[0], a[1]))
       .collect(Collectors.toList());
  • 将每个 String 映射到 String[](拆分)
  • 将每个 String[] 映射到一个 Double[] (parseDoule)
  • 将每个 Double[] 映射到 Point2D.Double
  • 收集到 List

替代方案(没有任何改进)可以是:

List<Point2D.Double> pointList = pointStrList
            .map(pointStr -> Stream.of(pointStr.split(",")))
            .map(a -> a.mapToDouble(Double::parseDouble).toArray())
            .map(a -> new Point2D.Double(a[0], a[1]))    
            .collect(Collectors.toList());