import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class JI9049867 {
	public static void main(String[] args) { 
		test(); 
	} 

	private static void test() { 
		Function<Integer, Integer> classifier = e -> 0; 
		Supplier<Map<Integer, Optional<Integer>>> mapFactory = MyOptionalMap::new; 
		Collector<Integer, ?, Optional<Integer>> downstream = Collectors.reducing((e1, e2) -> 0); 
		Stream.of(0) 
		.collect(Collectors.groupingBy( 
				classifier, 
				mapFactory, 
				downstream)); 
	} 

	private static class MyOptionalMap<K, V> extends HashMap<K, Optional<V>> { 

		@Override 
		public Optional<V> computeIfAbsent(K key, Function<? super K, ? extends Optional<V>> mappingFunction) { 
			Optional<V> v = super.computeIfAbsent(key, mappingFunction); // force runtime type check 
			return v; 
		} 
	} 
}
