import com.hazelcast.mapreduce.Reducer; import com.hazelcast.mapreduce.ReducerFactory; public class NumberCountAndOpReducerFactory implements ReducerFactory<Integer, Integer, NumberReductionResult> { @Override public Reducer<Integer, Integer, NumberReductionResult> newReducer(Integer key) { return new NumberCountReducer(key); } private class NumberCountReducer extends Reducer<Integer, Integer, NumberReductionResult> { private volatile int countOfTheSameKeyInTheChunk = 0; private Integer key; public NumberCountReducer(Integer key) { this.key = key; } @Override public void reduce(Integer value) { countOfTheSameKeyInTheChunk += value.longValue(); } @Override public NumberReductionResult finalizeReduce() { System.out.println("Finalizing reduction on key: " + key); return new NumberReductionResult(countOfTheSameKeyInTheChunk, someOpOn(key)); } } private int someOpOn(Integer number) { if (number > 500) { return (int) Math.sqrt(number); } if (number > 250) { return (int) Math.atan(number); } return (int) Math.log(number); } }