У меня есть список транспортных средств, которые мне нужны для расчета общего расхода топлива на каждое транспортное средство. Я использую Java streams
, чтобы просмотреть список, получить транспортное средство, рассчитать расстояние до него с помощью Google distance matrix api
, использовать расстояние для расчета расхода топлива и вернуть ответ. Я заметил, что программа просто зависает, скорее всего, это может быть связано с тем, что stream
не ждет, пока Matrix api
вернет ответ, прежде чем перейти к следующему элементу, я говорю это, потому что я поместил system.out.println
вызовы в Matrix method
, а некоторые сообщения делают не распечатать.
Код, который должен рассчитать общий расход топлива
vehicles.stream().map(vehicles ->
calculateTotalFuelBeingUsedByAllVehicles(vehicle, getDistanceBetweenOriginsAndDestination(
new LatLng(vehicle.getOrigin().getLatitude(), vehicle.getOrigin().getLatitude()), new LatLng(vehicle.getDestination().getLatitude(), vehicles.getDestination().getLatitude()))))
.collect(Collectors.toList());
public static double getDistanceBetweenOriginsAndDestination(LatLng origin, LatLng destination){
//Gets printed
System.out.println("Calculating distance");
GeoApiContext context = new GeoApiContext.Builder()
.apiKey(GOOGLE_MAPS_API_KEY)
.build();
DistanceMatrixApiRequest distanceMatrixApiRequest = DistanceMatrixApi.newRequest(context)
.mode(TravelMode.DRIVING)
.trafficModel(TrafficModel.BEST_GUESS)
.departureTime(Instant.now().atZone(ZoneOffset.UTC).toInstant())
.destinations(destination)
.origins(origin);
try {
long distance = Arrays.stream(distanceMatrixApiRequest.await().rows)
.flatMap(distanceMatrixRow -> Arrays.stream(distanceMatrixRow.elements))
.mapToLong(distanceMatrixElement -> distanceMatrixElement.distance.inMeters)
.sum();
//Never gets printed
System.out.println("Calculated distance: "+distance);
return distance;
} catch (ApiException | InterruptedException | IOException e) {
//Never gets printed
System.out.println("Error encountered when calculating distance");
e.printStackTrace();
}
return 0;
}
В getDistanceBetweenOriginsAndDestination
печатается System.out.println("Calculating distance")
, а остальные нет.
@AndyTurner Я так думаю, но, естественно, этот метод должен возвращать ответ через некоторое время, но в данном случае это не так.
У вас опечатка при создании LatLng
, вы отправляете широту вместо долготы. Возможно, Google вам не отвечает или отвечает очень долго, потому что невозможно просчитать маршрут между этими точками. Просто предложение.
@DmytroDovzhenko прав, проверьте эту строку: new LatLng(vehicle.getOrigin().getLatitude(), vehicle.getOrigin().getLatitude())
, есть getLatitude()
два раза... Может быть, проблема здесь.
@DmytroDovzhenko вау, большое спасибо, это сработало, пожалуйста, сделайте это ответом, чтобы я мог его отметить.
У вас опечатка при создании LatLng, вы отправляете широту вместо долготы. Возможно, Google вам не отвечает или отвечает очень долго, потому что невозможно просчитать маршрут между этими точками.
Итак, он застревает на
distanceMatrixApiRequest.await()
?