import java.util.function.Consumer ;
import java.util.function.Predicate ;
import java.util.stream.IntStream ;
class ConditionalTee< T> implements Predicate< T> , Consumer< T> {
private final Predicate<? super T> predicate;
private final Consumer<? super T> consumer;
public ConditionalTee( Predicate<? super T> condition, Consumer<? super T> consumer) {
this .predicate = condition;
this .consumer = consumer;
}
@Override
public void accept( T t) {
test( t) ;
}
@Override
public boolean test( T t) {
// NOTE: inverted boolean.
// this will be called from a Stream.filter()
// need to return true if the value should stay on the stream
// false if it should be removed from the stream.
// We want to keep it on the stream if we are not siphoning it off
// (return true).
// We want to remove from the stream if we are siphoning the value off
// (return false).
if ( ! predicate.test ( t) ) {
return true ;
}
consumer.accept ( t) ;
return false ;
}
public static void main
( String [ ] args
) {
Predicate
< Integer
> p1
= ( Integer i
) -> { System .
out .
println ( "call p1" ) ; return i < 5 ;
} ;
Predicate
< Integer
> p2
= ( Integer i
) -> { System .
out .
println ( "call p2" ) ; return i > 5 ;
} ;
Consumer
< Integer
> c1
= i
-> System .
out .
println ( "less" ) ; Consumer
< Integer
> c2
= i
-> System .
out .
println ( "more" ) ;
IntStream.range ( 0 , 10 ) .boxed ( )
.peek ( new ConditionalTee<> ( p1, c1) )
.forEach ( new ConditionalTee<> ( p2, c2) ) ;
System .
out .
println ( ">>>>>>>>>>>>>>>>>>>>>>" ) ; IntStream.range ( 0 , 10 ) .boxed ( )
.filter ( new ConditionalTee<> ( p1, c1) )
.forEach ( new ConditionalTee<> ( p2, c2) ) ;
}
}
aW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKCmNsYXNzIENvbmRpdGlvbmFsVGVlPFQ+IGltcGxlbWVudHMgUHJlZGljYXRlPFQ+LCBDb25zdW1lcjxUPiB7CgogICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGU8PyBzdXBlciBUPiBwcmVkaWNhdGU7CiAgICBwcml2YXRlIGZpbmFsIENvbnN1bWVyPD8gc3VwZXIgVD4gY29uc3VtZXI7CgogICAgcHVibGljIENvbmRpdGlvbmFsVGVlKFByZWRpY2F0ZTw/IHN1cGVyIFQ+IGNvbmRpdGlvbiwgQ29uc3VtZXI8PyBzdXBlciBUPiBjb25zdW1lcikgewogICAgICAgIHRoaXMucHJlZGljYXRlID0gY29uZGl0aW9uOwogICAgICAgIHRoaXMuY29uc3VtZXIgPSBjb25zdW1lcjsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyB2b2lkIGFjY2VwdChUIHQpIHsKICAgICAgICB0ZXN0KHQpOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGJvb2xlYW4gdGVzdChUIHQpIHsKICAgICAgICAvLyBOT1RFOiBpbnZlcnRlZCBib29sZWFuLgogICAgICAgIC8vIHRoaXMgd2lsbCBiZSBjYWxsZWQgZnJvbSBhIFN0cmVhbS5maWx0ZXIoKQogICAgICAgIC8vIG5lZWQgdG8gcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHNob3VsZCBzdGF5IG9uIHRoZSBzdHJlYW0KICAgICAgICAvLyBmYWxzZSBpZiBpdCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICAgLy8gV2Ugd2FudCB0byBrZWVwIGl0IG9uIHRoZSBzdHJlYW0gaWYgd2UgYXJlIG5vdCBzaXBob25pbmcgaXQgb2ZmCiAgICAgICAgLy8gICAgIChyZXR1cm4gdHJ1ZSkuCiAgICAgICAgLy8gV2Ugd2FudCB0byByZW1vdmUgZnJvbSB0aGUgc3RyZWFtIGlmIHdlIGFyZSBzaXBob25pbmcgdGhlIHZhbHVlIG9mZgogICAgICAgIC8vICAgICAocmV0dXJuIGZhbHNlKS4KICAgICAgICBpZiAoIXByZWRpY2F0ZS50ZXN0KHQpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25zdW1lci5hY2NlcHQodCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAKICAgICAgICBQcmVkaWNhdGU8SW50ZWdlcj4gcDEgPSAoSW50ZWdlciBpKSAtPiB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsbCBwMSIpOwogICAgICAgICAgICByZXR1cm4gaSA8IDU7CiAgICAgICAgfTsKICAgICAgICBQcmVkaWNhdGU8SW50ZWdlcj4gcDIgPSAoSW50ZWdlciBpKSAtPiB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsbCBwMiIpOwogICAgICAgICAgICByZXR1cm4gaSA+IDU7CiAgICAgICAgfTsKICAgICAgICBDb25zdW1lcjxJbnRlZ2VyPiBjMSA9IGkgLT4gU3lzdGVtLm91dC5wcmludGxuKCJsZXNzIik7CiAgICAgICAgQ29uc3VtZXI8SW50ZWdlcj4gYzIgPSBpIC0+IFN5c3RlbS5vdXQucHJpbnRsbigibW9yZSIpOwogICAgCiAgICAgICAgSW50U3RyZWFtLnJhbmdlKDAsIDEwKS5ib3hlZCgpCiAgICAgICAgICAgIC5wZWVrKG5ldyBDb25kaXRpb25hbFRlZTw+KHAxLCBjMSkpCiAgICAgICAgICAgIC5mb3JFYWNoKG5ldyBDb25kaXRpb25hbFRlZTw+KHAyLCBjMikpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiIpOwogICAgICAgIEludFN0cmVhbS5yYW5nZSgwLCAxMCkuYm94ZWQoKQogICAgICAgICAgICAuZmlsdGVyKG5ldyBDb25kaXRpb25hbFRlZTw+KHAxLCBjMSkpCiAgICAgICAgICAgIC5mb3JFYWNoKG5ldyBDb25kaXRpb25hbFRlZTw+KHAyLCBjMikpOwogICAgfQp9Cg==