Ответ 1
Из этот FAQ лямбда:
Где можно использовать лямбда-выражения?
Аргументы метода или конструктора, для которых целевой тип является типом соответствующий параметр. Если метод или конструктор перегружены, обычные механизмы разрешения перегрузки используются до лямбда выражение соответствует целевому типу. (После разрешения перегрузки, все еще может быть более одного метода или конструктора соответствия подпись, принимающая различные функциональные интерфейсы с идентичными функциональные дескрипторы. В этом случае выражение лямбда должно быть приведение к типу одного из этих функциональных интерфейсов);
Литые выражения, которые явно задают целевой тип. Например:
Object o = () -> { System.out.println("hi"); }; // Illegal: could be Runnable or Callable (amongst others)
Object o = (Runnable) () -> { System.out.println("hi"); }; // Legal because disambiguated
Итак, вам нужно будет указать его, если есть неоднозначные подписи.