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());
}
}