Ecco due soluzioni che coinvolgono la mia libreria StreamEx. La caratteristica principale che sto usando qui è il concetto di collettori a corto circuito.La mia biblioteca esalta il concetto Collector
per fornire la capacità di corto circuito (che funziona sia per i flussi sequenziali e paralleli)
Se predicati sono come nel campione (uno è l'opposto di un altro), è possibile utilizzare partitioningBy
:
Map<Boolean, Optional<Integer>> map = IntStreamEx.of(ints).boxed()
.partitioningBy(num -> num == 5, MoreCollectors.first());
Ora si dovrebbe verificare se entrambe le mappature sono presenti:
System.out.println(map.values().stream().allMatch(Optional::isPresent));
O in un'unica istruzione:
System.out.println(IntStreamEx.of(ints).boxed()
.partitioningBy(num -> num == 5, MoreCollectors.first())
.values().stream().allMatch(Optional::isPresent));
Qui stiamo usando il collettore di cortocircuito MoreCollectors.first()
. Questa soluzione è simile a quella proposta da @ user140547, ma in realtà smetterà di processare non appena vengono trovati entrambi gli elementi.
Per due personalizzata predicati è possibile utilizzare pairing
collettore che combina i risultati di due collettori (conservando l'cortocircuitando se collettori di ingresso sono corto circuito). Ma in primo luogo, abbiamo bisogno anyMatching
collezionista (che è assente nella mia libreria):
import static one.util.streamex.MoreCollectors.*;
static <T> Collector<T, ?, Boolean> anyMatching(Predicate<T> pred) {
return collectingAndThen(filtering(pred, first()), Optional::isPresent);
}
Collector<Integer, ?, Boolean> hasFive = anyMatching(num -> num == 5);
Collector<Integer, ?, Boolean> hasNonFive = anyMatching(num -> num != 5);
Collector<Integer, ?, Boolean> hasBoth = pairing(hasFive, hasNonFive,
(res1, res2) -> res1 && res2);
System.out.println(IntStreamEx.of(ints).boxed().collect(hasBoth));
Beh, questa soluzione utilizza una mutabile 'BitSet', sarebbe non meglio evitare che come l'intera API Stream è circa evitare stato mutevole? – user140547