lamda表达式的引入主要是为了解决匿名内部类的问题,比如:
public interface func{
public void method();
}
当我们有一个对象要调用func的方法,且func的对象只会在此处用一次,我们会这么写个匿名类:
funcService.service(new func(){
public void method(){
System.out.println("hello");
}
})
这样太过于臃肿了。因此引入了lamda表达式。
要实现上面的功能,我们可以这么写
@FunctionalInterface
public interface func {
void method();
}
public class Main {
public static void main(String[] args) {
func f=()-> System.out.println("hello");
}
注解@FunctionalInterface表明这是一个函数式接口,只会拥有一个方法。该方法可以通过lamda表达式实现。
lamda表达式的形式如:
(s1)->{ 执行语句};
其实就是通过这个lamda表达式构造一个函数式接口的实现。而实现哪个函数式接口则通过上下文类型推断。上面的例子是通过变量声明推断的,也可以通过返回值推断,比如:
public static func t1(){
return ()-> System.out.println("hello");
}
public class Main {
public static void main(String[] args) {
t1().method();
}
}
当然我们也可以在方法内部定义参数类型或者返回类型,比如:
@FunctionalInterface
public interface func<T,E> {
E method(T t);
}
public class Main {
public static void main(String[] args) {
func<String,Integer> f= (s1)->Integer.parseInt(s1);
System.out.println(f.method("3"));
System.out.println(f.method("3").getClass());
}
}