2015-08-10 4 views
4

Я видел только такие примеры, как следующие для составления функций (или людей, использующих лямбда).Java 8 Как создавать функции без Lambdas?

Function<A,B> inner = ....; 
Function<B,C> outter = ....; 
Function<A,C> result = outter.compose(inner); 

Я хотел бы использовать следующие функции, используя функцию «compose», а не просто ссылаясь на них напрямую.

public class J{ 
    public static B inner(final A a){...} 
    public static C outter(final B b){...}  
} 
public class K{ 
    public static Function<A,C> result = (J::outter).compose(J::inner); 
} 

Это не скомпилировано. Кажется, я не могу использовать этот «составный» член java.util.function.Function. Как это сделать для традиционно объявленных функций? Я хотел бы избежать следующего:

public class K{ 
    public static Function<A,C> result = (a)-> J.outter(J.inner(a)); 
} 

Это можно сделать ?? Заранее спасибо

ответ

8

Ссылка на метод (и lambdas) нужна контекст для них иметь смысл в исходном коде. Этот контекст описывает функциональный интерфейс целевого, содержит подробную информацию для типа вывода дженерик и т.д.

Использование ссылок методы в

public static Function<A,C> result = (J::outter).compose(J::inner); 

нет контекста. Каким должен быть первый J::outter? Зачем?

Нанести бросок, чтобы дать ему этот контекст

public static Function<A, C> result = ((Function<B, C>) J::outter).compose(J::inner); 

, которые, на мой взгляд, уродливее, чем решение лямбда.

+0

Я заметил много вопросов по строкам «Как это сделать с этими понятиями», и реальный ответ: «Вы можете сделать это таким образом, но не должны. Сделайте это« классическим » ' путь." – Daniel

Смежные вопросы