/* package whatever; // don't place package name! */
import java.util.ArrayList ;
import java.util.Collections ;
import java.util.List ;
import java.util.function.BiConsumer ;
import java.util.function.BinaryOperator ;
import java.util.function.Function ;
import java.util.function.Supplier ;
import java.util.stream.Collector ;
public class Main {
public static void main
( String [ ] args
) { ArrayList< MyCustomObject> list = new ArrayList<> ( ) ;
for ( int i = 0 ; i < 10 ; i++ ) {
for ( int j = 0 ; j < 3 ; j++ ) {
list.add ( new MyCustomObject( i) ) ;
}
}
class Intermediate {
List< MyCustomObject> objects = new ArrayList<> ( ) ;
}
Supplier< Intermediate> supplier = ( ) -> new Intermediate( ) ;
BiConsumer< Intermediate, MyCustomObject> accumulator = ( i, c) -> {
System .
out .
printf ( "accumulating %d into %d%n" , c.
intField , i.
value ) ; if ( i.value != null ) {
if ( c.intField > i.value .intValue ( ) ) {
// new max found
System .
out .
println ( "new max " + c.
intField + ", dropping " + i.
objects .
size ( ) + " objects" ) ; i.value = c.intField ;
i.objects .clear ( ) ;
} else if ( c.intField < i.value ) {
return ;
}
} else {
i.value = c.intField ;
}
i.objects .add ( c) ;
} ;
BinaryOperator< Intermediate> combiner = ( i1, i2) -> {
System .
out .
printf ( "combining %d and %d%n" , i1.
value , i2.
value ) ; Intermediate result = new Intermediate( ) ;
result.
value = Math .
max ( i1.
value , i2.
value ) ; if ( i1.value .intValue ( ) == result.value .intValue ( ) ) {
result.objects .addAll ( i1.objects ) ;
}
if ( i2.value .intValue ( ) == result.value .intValue ( ) ) {
result.objects .addAll ( i2.objects ) ;
}
return result;
} ;
Function< Intermediate, List< MyCustomObject>> finisher = i -> {
return i.objects ;
} ;
Collector< MyCustomObject, Intermediate, List< MyCustomObject>> collector = Collector.of ( supplier, accumulator,
combiner, finisher) ;
System .
out .
println ( list.
stream ( ) .
collect ( collector
) ) ; }
static class MyCustomObject {
private int intField;
MyCustomObject( int field) {
intField = field;
}
public int getIntField( ) {
return intField;
}
@Override
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUNvbnN1bWVyOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpbmFyeU9wZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I7CgpwdWJsaWMgY2xhc3MgTWFpbiB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgQXJyYXlMaXN0PE15Q3VzdG9tT2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7CiAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXcgTXlDdXN0b21PYmplY3QoaSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUobGlzdCk7CgogICAgICAgIGNsYXNzIEludGVybWVkaWF0ZSB7CiAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSBudWxsOwogICAgICAgICAgICBMaXN0PE15Q3VzdG9tT2JqZWN0PiBvYmplY3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgfQogICAgICAgIFN1cHBsaWVyPEludGVybWVkaWF0ZT4gc3VwcGxpZXIgPSAoKSAtPiBuZXcgSW50ZXJtZWRpYXRlKCk7CiAgICAgICAgQmlDb25zdW1lcjxJbnRlcm1lZGlhdGUsIE15Q3VzdG9tT2JqZWN0PiBhY2N1bXVsYXRvciA9IChpLCBjKSAtPiB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJhY2N1bXVsYXRpbmcgJWQgaW50byAlZCVuIiwgYy5pbnRGaWVsZCwgaS52YWx1ZSk7CiAgICAgICAgICAgIGlmIChpLnZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChjLmludEZpZWxkID4gaS52YWx1ZS5pbnRWYWx1ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbmV3IG1heCBmb3VuZAogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibmV3IG1heCAiICsgYy5pbnRGaWVsZCArICIsIGRyb3BwaW5nICIgKyBpLm9iamVjdHMuc2l6ZSgpICsgIiBvYmplY3RzIik7CiAgICAgICAgICAgICAgICAgICAgaS52YWx1ZSA9IGMuaW50RmllbGQ7CiAgICAgICAgICAgICAgICAgICAgaS5vYmplY3RzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMuaW50RmllbGQgPCBpLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaS52YWx1ZSA9IGMuaW50RmllbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaS5vYmplY3RzLmFkZChjKTsKICAgICAgICB9OwogICAgICAgIEJpbmFyeU9wZXJhdG9yPEludGVybWVkaWF0ZT4gY29tYmluZXIgPSAoaTEsIGkyKSAtPiB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJjb21iaW5pbmcgJWQgYW5kICVkJW4iLCBpMS52YWx1ZSwgaTIudmFsdWUpOwogICAgICAgICAgICBJbnRlcm1lZGlhdGUgcmVzdWx0ID0gbmV3IEludGVybWVkaWF0ZSgpOwogICAgICAgICAgICByZXN1bHQudmFsdWUgPSBNYXRoLm1heChpMS52YWx1ZSwgaTIudmFsdWUpOwogICAgICAgICAgICBpZiAoaTEudmFsdWUuaW50VmFsdWUoKSA9PSByZXN1bHQudmFsdWUuaW50VmFsdWUoKSkgewogICAgICAgICAgICAgICAgcmVzdWx0Lm9iamVjdHMuYWRkQWxsKGkxLm9iamVjdHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpMi52YWx1ZS5pbnRWYWx1ZSgpID09IHJlc3VsdC52YWx1ZS5pbnRWYWx1ZSgpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQub2JqZWN0cy5hZGRBbGwoaTIub2JqZWN0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICAgIEZ1bmN0aW9uPEludGVybWVkaWF0ZSwgTGlzdDxNeUN1c3RvbU9iamVjdD4+IGZpbmlzaGVyID0gaSAtPiB7CiAgICAgICAgICAgIHJldHVybiBpLm9iamVjdHM7CiAgICAgICAgfTsKICAgICAgICBDb2xsZWN0b3I8TXlDdXN0b21PYmplY3QsIEludGVybWVkaWF0ZSwgTGlzdDxNeUN1c3RvbU9iamVjdD4+IGNvbGxlY3RvciA9IENvbGxlY3Rvci5vZihzdXBwbGllciwgYWNjdW11bGF0b3IsCiAgICAgICAgICAgICAgICBjb21iaW5lciwgZmluaXNoZXIpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnN0cmVhbSgpLmNvbGxlY3QoY29sbGVjdG9yKSk7CiAgICB9CgogICAgc3RhdGljIGNsYXNzIE15Q3VzdG9tT2JqZWN0IHsKICAgICAgICBwcml2YXRlIGludCBpbnRGaWVsZDsKCiAgICAgICAgTXlDdXN0b21PYmplY3QoaW50IGZpZWxkKSB7CiAgICAgICAgICAgIGludEZpZWxkID0gZmllbGQ7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgaW50IGdldEludEZpZWxkKCkgewogICAgICAgICAgICByZXR1cm4gaW50RmllbGQ7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhpbnRGaWVsZCk7CiAgICAgICAgfQogICAgfQp9Cg==