У меня есть пара predicates, что я все хочу быть удовлетворенным.anyMatch внутри allMatch
То, что может удовлетворить эти предикаты, - это несколько строк. Отдельная строка не должна удовлетворять всем (или любым) из этих предикатов, но после того, как я посмотрел на последнюю строку, все предикаты должны быть удовлетворены.
Мой первый дубль, чтобы представить эту проблему в Java, чтобы использовать Stream «s allMatch
и anyMatch
, так как я хочу все предикатов к матча любой из вещей, чтобы тест:
Stream<String> thingsToTest = Stream.of("Hi", "predicates!", "oddball");
Predicate<String> startsWithH = string -> string.startsWith("H");
Predicate<String> endsWithBang = string -> string.endsWith("!");
Stream<Predicate<String>> predicates = Stream.of(startsWithH, endsWithBang);
// All of the strings have the chance to satisfy any predicate
boolean predicatesSatisfied = predicates.allMatch(pred -> thingsToTest.anyMatch(pred::test));
// I expect this to print "true"
System.out.println(predicatesSatisfied);
К сожалению , это не работает, но заканчивается с IllegalStateException
, говоря мне, что stream has already been operated upon or closed
, который не должен быть большим сюрпризом, поскольку для каждого предиката я даю строкам новый шанс удовлетворить предикат, используя поток строк снова и снова , And streams are not meant to be reused for good reasons.
Как я могу избежать этого исключения? Есть ли более элегантная альтернатива anyMatch
или allMatch
?
Более или менее, сделать 'thingsToTest' коллекцию, которая может быть restreamed, а не' Stream' сам, что может только использовать один раз. –