Поскольку основной целью является решение для сбора List<StrokePoint>
, вы можете выполнить его с помощью операции flatMap
следующим образом:
List<StrokePoint> points = strokesData.getListOfSessions()
.stream()
.flatMap(ss -> ss.getListOfStrokes().stream()
.flatMap(s -> s.getListOfStrokePoints().stream()))
.collect(Collectors.toList());
Кроме того, счет Stroke
с также может бытьвычисляется с использованием потоков путем суммирования размера списков следующим образом:
long strokeCount = strokesData.getListOfSessions()
.stream()
.mapToLong(ss -> ss.getListOfStrokes().size())
.sum();
Чтобы объединить эти операции, вы можете создать AbstractMap.SimpleEntry
, уменьшив записи следующим образом:
AbstractMap.SimpleEntry<Integer, Stream<StrokePoint>> reduce = strokesData.getListOfSessions()
.stream()
.map(ss -> new AbstractMap.SimpleEntry<>(ss.getListOfStrokes().size(),
ss.getListOfStrokes()
.stream()
.flatMap(s -> s.getListOfStrokePoints().stream())))
.reduce(new AbstractMap.SimpleEntry<>(1, Stream.empty()),
(e1, e2) -> new AbstractMap.SimpleEntry<>(
Integer.sum(e1.getKey(), e2.getKey()),
Stream.concat(e1.getValue(), e2.getValue())));
Используя эту запись, вы можете получить число Stroke
с и список StrokePoint
с:
long strokeCount = reduce.getKey();
List<StrokePoint> strokePoints = reduce.getValue().collect(Collectors.toList());