Java 流,等待 Google 到 return 结果的距离矩阵
Java streams, wait for Google distance matrix to return result
我有一份车辆清单,我需要计算每辆车使用的总燃料。我正在使用 Java streams
循环列表,获取车辆,使用 Google distance matrix api
计算其距离,使用距离计算燃料使用量和 return 响应。我注意到程序挂起很可能是 stream
在移动到下一个项目之前没有等待 Matrix api
到 return 的响应,我这样说是因为我在 Matrix method
中放置了 system.out.println
个调用,但一些消息没有打印出来。
用于计算总燃料使用量的代码
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")
被打印出来,其余的没有。
您在创建 LatLng 时输入错误,您发送的是纬度而不是经度。可能是Google没有回复你或者回复的时间很长,因为无法计算出这些点之间的路线。
我有一份车辆清单,我需要计算每辆车使用的总燃料。我正在使用 Java streams
循环列表,获取车辆,使用 Google distance matrix api
计算其距离,使用距离计算燃料使用量和 return 响应。我注意到程序挂起很可能是 stream
在移动到下一个项目之前没有等待 Matrix api
到 return 的响应,我这样说是因为我在 Matrix method
中放置了 system.out.println
个调用,但一些消息没有打印出来。
用于计算总燃料使用量的代码
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")
被打印出来,其余的没有。
您在创建 LatLng 时输入错误,您发送的是纬度而不是经度。可能是Google没有回复你或者回复的时间很长,因为无法计算出这些点之间的路线。