import java.util.*;
import java.util.stream.*;
import java.util.function.*;


class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		List<Integer> list = Arrays.asList(4,3,7,1,5,2,9);
		System.out.println(list.stream().collect(COLLECT_MIN));
	}
	
	static Collector<Integer, Minimum, Integer> COLLECT_MIN = new Collector<Integer, Minimum, Integer>() {
            @Override
            public Supplier<Minimum> supplier() {
                return Minimum::new;
            }
            @Override
            public BiConsumer<Minimum, Integer> accumulator() {
                return Minimum::accept;
            }
            @Override
            public BinaryOperator<Minimum> combiner() {
               return Minimum::combine;
            }
            @Override
            public Function<Minimum, Integer> finisher() {
                return Minimum::getIndex;
            }
            @Override
            public Set<Collector.Characteristics> characteristics() {
                return Collections.emptySet();
            }
        };
	
	static class Minimum {
        int index = -1; 
        int range = 0;
        int value;

        public void accept(int value) {
            if (range == 0 || value < this.value) {
                index = range;
                this.value = value;
            }
            range++;
        }
        
        public Minimum combine(Minimum other) {
            if (value > other.value) {
                index = range + other.index;
                value = other.value;
            }
            range += other.range;
            return this;
        }
        
        public int getIndex() {
            return index;
        }
    }
}