Можно ли переписать цикл WHILE с гарантированными запросами, пытаясь использовать Java Stream api

#java #java-stream #junit5 #rest-assured

Вопрос:

У меня есть метод, который отправляет запрос через Rest-assured, и если ответ не соответствует условию (код состояния ответа 200), он предпринимает несколько попыток, если я не получу 200 в качестве кода состояния ответа

 protected Response getResponseWithRetries(Maplt;String, Objectgt; requestBody, String token, String url) {  Response response = null;  int statusCode = HttpStatus.SC_BAD_GATEWAY;  int count = 0;  while (statusCode != HttpStatus.SC_OK amp;amp; count lt; 3) {  response = getResponse(requestBody, token, url);  statusCode = response.getStatusCode();  count  ;  sleep(5000);  }  return response; }  

Но можно ли переписать этот цикл с помощью Stream api? Я изо всех сил пытаюсь понять, могу ли я применить это в своем случае. Начнем с того, что у меня нет коллекции ответов для потоковой передачи. Но я также не хочу делать несколько запросов на его создание (например, когда все они будут успешными).

Ответ №1:

Вы можете использовать IntStream.range для замены count части вашего условия, а затем отфильтровать ответ для кода состояния http и вернуть первое вхождение с findFirst помощью .

 Optionallt;Responsegt; response = IntStream.range(0, 3)  .mapToObj(i -gt; getResponse(requestBody, token, url))  .filter(r -gt; r.getStatusCode() == HttpStatus.SC_OK)  .findFirst(); return response.orElse(null);  

Если есть вероятность, что вы вернетесь null вместо ответа, имеет смысл изменить тип возврата на Optionallt;Responsegt; .


Если вы хотите получить последний ответ, даже если он не удался, вы можете выполнить 2 итерации, а затем Optional.orElseGet выполнить последний getResponse вызов, если в 2 итерациях не был возвращен положительный код состояния.

 Optionallt;Responsegt; response = IntStream.range(0, 2)  .mapToObj(i -gt; getResponse(requestBody, token, url))  .filter(r -gt; r.getStatusCode() == HttpStatus.SC_OK)  .findFirst(); return response.orElseGet(() -gt; getResponse(requestBody, token, url));  

Комментарии:

1. спасибо, это похоже на то, что мне нужно, единственное изменение, которое мне нужно, — это принять последний ответ, если все попытки не увенчались успехом.

2. Я отредактировал ответ, чтобы привести пример того, как всегда возвращать последнюю попытку.