Я использую .peek() в своем потоке, но на него нахмурился, к сожалению, я не могу найти решение.
Упрощенная версия:
static boolean fooAddTester(int size) {
    Foo foo = new foo(); //data structure
    return IntStream.range(0, size).
            .peek(i -> synchronized(r){foo.add(i)})
            .allMatch(e -> foo.isLegal());
}
что мне нужно сделать, это перебрать IntStream и проверить после каждой вставки, если структура данных foo является законной. Это логически эквивалентно:
static boolean fooAddTester(int size) {
    Foo foo = new foo(); //data structure
    for(int i=0; i<size; i++){
        foo.add(i);
        if(!foo.isLegal())
            return false;
    return true;
}
Однако это сложнее, и я пытаюсь использовать потоки для упрощения и изучения.
Способ сделать то же самое без использования .peek() заключается в следующем: что работает, но я просто "переместил" проблему на .allMatch():
return IntStream.range(0, size).
            .allMatch(i -> {
                 synchronized(r){foo.add(i)};
                 foo.isLegal();
             )};
Моя проблема очень похожа на на этот вопрос, разница в том, что я проверяю каждый раз, чтобы решения не работали.
Итак, мои вопросы:
-  Действительно ли .peek()только для отладки или я могу использовать его таким образом?
- Есть ли лучшее решение?
- Должен ли я использовать свое второе решение?
Я ищу правильное решение, а не рабочее решение, все эти коды уже работают.
