package lv.enes.mc.eris_alchemy.utils; import java.util.OptionalDouble; import java.util.Set; 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 OptionalDoubleSummer implements Collector, OptionalDouble> { @Override public Supplier> supplier() { return () -> new Ref<>(OptionalDouble.of(0)); } @Override public BiConsumer, OptionalDouble> accumulator() { return (ref, od) -> { if (ref.getValue().isPresent()) { if (od.isPresent()) { ref.setValue(OptionalDouble.of(ref.getValue().getAsDouble() + od.getAsDouble())); } else { ref.setValue(OptionalDouble.empty()); } } }; } @Override public BinaryOperator> combiner() { return (ref1, ref2) -> { accumulator().accept(ref1, ref2.getValue()); return ref1; }; } @Override public Function, OptionalDouble> finisher() { return Ref::getValue; } @Override public Set characteristics() { return Set.of(Characteristics.UNORDERED); } }