fork(1) download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.List;
  6. import java.util.function.BiConsumer;
  7. import java.util.function.BinaryOperator;
  8. import java.util.function.Function;
  9. import java.util.function.Supplier;
  10. import java.util.stream.Collector;
  11.  
  12. public class Main {
  13. public static void main(String[] args) {
  14. ArrayList<MyCustomObject> list = new ArrayList<>();
  15. for (int i = 0; i < 10; i++) {
  16. for (int j = 0; j < 3; j++) {
  17. list.add(new MyCustomObject(i));
  18. }
  19. }
  20. Collections.shuffle(list);
  21.  
  22. class Intermediate {
  23. Integer value = null;
  24. List<MyCustomObject> objects = new ArrayList<>();
  25. }
  26. Supplier<Intermediate> supplier = () -> new Intermediate();
  27. BiConsumer<Intermediate, MyCustomObject> accumulator = (i, c) -> {
  28. System.out.printf("accumulating %d into %d%n", c.intField, i.value);
  29. if (i.value != null) {
  30. if (c.intField > i.value.intValue()) {
  31. // new max found
  32. System.out.println("new max " + c.intField + ", dropping " + i.objects.size() + " objects");
  33. i.value = c.intField;
  34. i.objects.clear();
  35. } else if (c.intField < i.value) {
  36. return;
  37. }
  38. } else {
  39. i.value = c.intField;
  40. }
  41. i.objects.add(c);
  42. };
  43. BinaryOperator<Intermediate> combiner = (i1, i2) -> {
  44. System.out.printf("combining %d and %d%n", i1.value, i2.value);
  45. Intermediate result = new Intermediate();
  46. result.value = Math.max(i1.value, i2.value);
  47. if (i1.value.intValue() == result.value.intValue()) {
  48. result.objects.addAll(i1.objects);
  49. }
  50. if (i2.value.intValue() == result.value.intValue()) {
  51. result.objects.addAll(i2.objects);
  52. }
  53. return result;
  54. };
  55. Function<Intermediate, List<MyCustomObject>> finisher = i -> {
  56. return i.objects;
  57. };
  58. Collector<MyCustomObject, Intermediate, List<MyCustomObject>> collector = Collector.of(supplier, accumulator,
  59. combiner, finisher);
  60. System.out.println(list.stream().collect(collector));
  61. }
  62.  
  63. static class MyCustomObject {
  64. private int intField;
  65.  
  66. MyCustomObject(int field) {
  67. intField = field;
  68. }
  69.  
  70. public int getIntField() {
  71. return intField;
  72. }
  73.  
  74. @Override
  75. public String toString() {
  76. return Integer.toString(intField);
  77. }
  78. }
  79. }
  80.  
Success #stdin #stdout 0.16s 33920KB
stdin
Standard input is empty
stdout
accumulating 1 into null
accumulating 9 into 1
new max 9, dropping 1 objects
accumulating 3 into 9
accumulating 7 into 9
accumulating 1 into 9
accumulating 4 into 9
accumulating 5 into 9
accumulating 2 into 9
accumulating 8 into 9
accumulating 5 into 9
accumulating 3 into 9
accumulating 8 into 9
accumulating 0 into 9
accumulating 3 into 9
accumulating 0 into 9
accumulating 9 into 9
accumulating 6 into 9
accumulating 2 into 9
accumulating 6 into 9
accumulating 8 into 9
accumulating 5 into 9
accumulating 6 into 9
accumulating 9 into 9
accumulating 7 into 9
accumulating 1 into 9
accumulating 2 into 9
accumulating 0 into 9
accumulating 4 into 9
accumulating 7 into 9
accumulating 4 into 9
[9, 9, 9]