Повторить поток allMatch() до true

int testValue;
boolean success = false;

while(success == false) {
 testValue = generateRandomInt();   
 success = mySystem.getHosts().parallelStream().allMatch(predicate(testValue));
}

return testValue;

Я играю с потоками java8. Что вы предлагаете сделать код выше более элегантным/читаемым?

Ответ 1

Вы можете использовать бесконечный IntStream вместо цикла while и вернуть первый int потока, который соответствует вашему условию:

return IntStream.generate (() -> generateRandomInt())
                .filter (i -> mySystem.getHosts().parallelStream().allMatch(predicate(i)))
                .findFirst()
                .getAsInt();

Ответ 2

Вы можете сделать это с помощью jdk-9 takeWhile (если доступно):

  Stream.generate(() -> generateRandomInt())
        .takeWhile(x -> mySystem.getHosts().parallelStream().allMatch(predicate(x)))
        .findAny()
        .get();