Я использую .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()
только для отладки или я могу использовать его таким образом? - Есть ли лучшее решение?
- Должен ли я использовать свое второе решение?
Я ищу правильное решение, а не рабочее решение, все эти коды уже работают.