Java "целевой тип преобразования лямбда должен быть интерфейсом"

Я пытаюсь использовать lambdas и streams в java, но я совершенно новичок в этом. Я получил эту ошибку в IntelliJ "целевой тип преобразования лямбда должен быть интерфейсом", когда я пытаюсь сделать лямбда-выражение

List<Callable<SomeClass>> callList = prgll.stream()
                                          .map(p->(()->{return p.funct();} )) <--- Here I get error
                                          .collect(Collectors.toList());

Я что-то делаю неправильно?

Ответ 1

Я подозреваю, что просто вывод типа Java не достаточно умен. Попробуйте

 .map(p -> (Callable<SomeClass>) () -> p.funct())

Ответ 2

Stream#map() - это typed method, поэтому вы можете явно указать тип:

 .<Callable<SomeClass>>map(p -> () -> p.funct())

или более аккуратно, используйте ссылку на метод:

 .<Callable<SomeClass>>map(p -> p::funct)