2017-01-11 7 views
2

Я пытаюсь перейти с Play 2.4 на Play 2.5. Используя руководство от Replaced F.Promise with Java 8's CompletionStage, я заменил F.Promise, map и flatMap с предлагаемыми заменами из предыдущей ссылки (отраженный фрагмент изменений ниже).Play 2.5 Ошибки с Java 8 - неправильное количество аргументов типа и выражение лямбда не ожидаются здесь ошибка

public CompletionStage<Result> parallel() { 
    final long start = System.currentTimeMillis(); 
    final CompletionStage<WSResponse, Long> getLatency = resp -> System.currentTimeMillis() - start; 

    CompletionStage<Long> googleLatency = WS.url("http://google.com").get().thenApplyAsync(getLatency); 
    CompletionStage<Long> yahooLatency = WS.url("http://yahoo.com").get().thenApplyAsync(getLatency); 

    return googleLatency.thenComposeAsync(googleResponseTime -> 
      yahooLatency.thenApplyAsync(yahooResponseTime -> 
       ok(format("Google response time: %d; Yahoo response time: %d", 
        googleResponseTime, yahooResponseTime))) 
    ); 
    } 

После запуска ./activator clean dist, я получаю ошибку ниже:

[ошибка] /Play-2-JS-2.5/app/controllers/Java8Controller.java:74: неверное число аргументы типа; требуется 1 [ошибка] CompletionStage [ошибка] /Play-2-JS-2.5/app/controllers/Java8Controller.java:74: выражение lambda не ожидается здесь [error] resp -> System.currentTimeMillis() - start

по какой-то причине, он считает, что должен быть только один, а не два в разделе CompletionStage<WSResponse, Long> getLatency, а также по какой-то причине это не нравится лямбда-выражение, даже если синтаксис перед новыми заменами API успешно работал в Play 2.4.

Я попытался вернуться к старым вызовам к тому, что отображается в https://github.com/btgrant-76/Play-2-Java-Scala-Java-8-Async-Comparison/blob/6a85cf31cfb804ef20bacf8e14d30ce46cc9307c/app/controllers/Java8Controller.java#L71-L83, однако это не дает лучших результатов. Бывал поиск в Интернете и поиск когда-то, но не уверен, как подойти к этому. Любые предложения с возможными примерами будут очень признательны.

ответ

2

Заменить

final CompletionStage<WSResponse, Long> getLatency = resp -> 
     System.currentTimeMillis() - start; 

с

final Function<WSResponse, Long> getLatency = resp -> System.currentTimeMillis() - start; 

так thenApplyAsync Metod в CompletionStage интерфейса принимает java.util.Function

Надеются, что это помогает.
Удача

+1

Это сработало, спасибо Tanmay Patil! – gitness

+1

Рад знать, что это помогло –