Zah*_*ari 6 java rest lazy-evaluation java-8 java-stream
所以我很好奇如何使用java8流API更好地重写以下代码.
public static List<FlightInfo> getResults(String origin,List<String> destinations) {
final String uri = "https://api.searchflight.com/;
List<FlightInfo> results = new LinkedList<FlightInfo>();
for(String destination:destinations) {
RestTemplate restTemplate = new RestTemplate();
String params = getParams(origin,destination);
FlightInfo result = restTemplate.postForObject(uri+params,FlightInfo.class);
results.add(result);
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
在完成此方法之后,我正在做它正在做的事情并且我收到了FLightInfo对象的列表,我将它转换为流并将对其进行各种转换(分组依此类推).现在很明显这是一个长期运行的操作.此外,它实际上将多个休息调用组合到Web服务,所以我已经拥有了在上次调用时获得的大部分数据,但是在整个方法返回之前我不会开始处理它.
有没有办法做更多反应性的事情?我可以立即返回一个流并对该流进行操作,因为它来自管道,或者这有点太多了?如何在Java 8中完成.那
那么这一切都取决于你何时需要结果.如果你希望它是连续的,下面的它仍然是一个体面的方式,因为它的懒惰.但它会在终端操作(比如在期间collect)沸腾.
public static Stream<FlightInfo> getResults(String origin,List<String> destinations) {
final String uri = "https://api.searchflight.com/";
return destinations.stream().map(destination -> {
RestTemplate restTemplate = new RestTemplate();
String params = getParams(origin,destination);
FlightInfo result = restTemplate.postForObject(uri+params,FlightInfo.class);
return result;
})
}
Run Code Online (Sandbox Code Playgroud)
或者destinations.stream().parallel()如果可以,我会这样做.在大多数情况下,这是一个合理的结果.但是在你为它调用终端操作之前,它仍然不能并行开始处理它.这绝对有道理.
但在我看来,你希望生产者 - 消费者类型的东西.对于:
public static CompletableFuture<List<FlightInfo>> getResults(String origin,List<String> destinations) {
final String uri = "https://api.searchflight.com/";
List<CompletableFuture<FlightInfo>> collect = destinations
.stream()
.map(destination -> CompletableFuture.supplyAsync(() -> {
RestTemplate restTemplate = new RestTemplate();
String params = getParams(origin,destination);
FlightInfo result = restTemplate.postForObject(uri+params,FlightInfo.class);
return result;
})).collect(Collectors.toList());
return sequence(collect); //line-1
}
public static <T> CompletableFuture<List<T>> sequence(List<CompletableFuture<T>> com) {
return CompletableFuture.allOf(com.toArray(new CompletableFuture[com.size()]))
.thenApply(v -> com.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList())
);
}
Run Code Online (Sandbox Code Playgroud)
为简单起见,line-1您可以简单地返回collect而不是sequence(collect).然后,您可以遍历列表以获取每个值.
但是sequence,有一个CompletableFuture对象需要担心,如果完成,您可以立即检查值.
| 归档时间: |
|
| 查看次数: |
770 次 |
| 最近记录: |