Java Как преобразовать поток строковых точек в ArrayList - PullRequest
2 голосов
/ 28 февраля 2020

У меня есть поток 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]));

, но когда я пытаюсь преобразовать в ArrayList<Point2D.Double> dping:

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

Это выдает ошибку:

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

Ответы [ 2 ]

4 голосов
/ 28 февраля 2020

Я думаю, что ваше решение не может работать, когда вы делаете:

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

val - это поток, и вы пытаетесь дважды вызвать toArray() для него. Это не работает с потоками, когда вы делаете val.toArray() в первый раз, он потребляет поток, и вы не можете использовать этот поток снова, поэтому во второй раз вы получите исключение. См. Здесь для дальнейших объяснений

Вы можете получить список непосредственно следующим образом:

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[] (split )
  • сопоставить каждый String[] с Double[] (parseDoule)
  • сопоставить каждый Double[] с Point2D.Double
  • собрать с List
1 голос
/ 28 февраля 2020

Альтернатива (без каких-либо улучшений) может быть:

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());
...