I have the following example data set that I want to transform/reduce using the Java Stream API based on direction's value
Direction int[] IN 1, 2 OUT 3, 4 OUT 5, 6, 7 IN 8 IN 9 IN 10, 11 OUT 12, 13 IN 14 to
Direction int[] IN 1, 2, OUT 3, 4, 5, 6, 7 IN 8, 9, 10, 11 OUT 12, 13 IN 14 Code that I've written so far:
enum Direction { IN, OUT } class Tuple { Direction direction; int[] data; public Tuple merge(Tuple t) { return new Tuple(direction, concat(getData(), t.getData())); } } private static int[] concat(int[] first, int[] second) { int[] result = Arrays.copyOf(first, first.length + second.length); System.arraycopy(second, 0, result, first.length, second.length); return result; } List<Tuple> reduce = tupleStream.reduce(new ArrayList<>(), WDParser::add, WDParser::combine); private static List<Tuple> combine(List<Tuple> list1, List<Tuple> list2) { System.out.println("combine"); list1.addAll(list2); return list1; } private static List<Tuple> add(List<Tuple> list, Tuple t) { System.out.println("add"); if (list.size() == 0) { list.add(t); } else if (list.size() > 0) { int lastIndex = list.size() - 1; Tuple last = list.get(lastIndex); if (last.getDirection() == t.getDirection()) list.set(lastIndex, last.merge(t)); else list.add(t); } return list; } I believe there is a better and simpler alternative to achieving the same.
Online examples and blogs I've found for Java Stream API reduce/combine use the Integer::sum function only. I'm hoping to build this up for more complex case scenarios.