Java函數式編程、lambda表達式
Java8開始支持函數式編程、包括lambda表達式、Stream流。
函數式編程用於簡化開發,對於某些類,或許只使用一次,那麼就沒必要對其進行單獨的實現一個類,java原本提供了簡化的方案,如內部類、匿名內部類等。
lambda對此更加簡化。
函數式接口
函數式接口就是隻有一個方法的接口,想想函數是不是一個個是獨立的。
Runnable接口就是一個函數式接口,如下:
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
//@FunctionalInterface註解代表這是一個函數式接口,但不是必須的,加上註解jvm會幫助檢查。
// public abstract void run();中的abstract也可以省略,接口中的方法本就是抽象方法
使用了函數式接口後,就不需要實現類,直接使用lambda即可。
lambda表達式
lambda用於替代實現類,形式如下:
FunctionalInterface func=()->{
......
};
實例
函數式接口
@FunctionalInterface
interface Func{
void hello();
}
lambda表達式
public class LambdaDemo {
public static void main(String[] args) {
Func func=()->{
System.out.println("hello");//lambda表達式
};
func.hello();//調用方法
}
}
帶返回值
直接在抽象方法前加上返回類型,在lambda中有返回值即可。
public class LambdaDemo {
public static void main(String[] args) {
Func func=()->{
System.out.println("hello");
return "ok lambda";
};
String s = func.hello();
System.out.println(s);
}
}
@FunctionalInterface
interface Func{
String hello();
}
帶參數
參數聲明在抽象方法中,在lambda中加上類型即可:
public class LambdaDemo {
public static void main(String[] args) {
Func func=(int a,String c)->{
System.out.println("hello"+a+c);
return "ok lambda";
};
String s = func.hello(8,"yes");
System.out.println(s);
}
}
lambda中的數據類型可以略去
Func func=( a,c)->{
System.out.println("hello"+a+c);
return "ok lambda";
};
如果只有一個參數的話,連()都可以省略。
public class LambdaDemo {
public static void main(String[] args) {
Func func=c->{ //lambda省去()
System.out.println("hello "+c);
return "ok lambda";
};
String s = func.hello("yes");
System.out.println(s);
}
}
@FunctionalInterface
interface Func{
String hello(String b);
}
內置函數式接口
JDK 1.8爲我們預定義了許多函數式接口,它們位於java.util.function包中。
常用的如下:
序號 | 接口名 | 抽象方法 | 說明 |
---|---|---|---|
1 | Supplier | Tget() | 無輸入參數,通過一系列操作產生一個結果返回 |
2 | Consumer | voidaccept(Tt) | 一個輸入參數,針對參數做一系列操作,無返回值 |
3 | Function<T,R> | Rapply(Tt) | 一個參數,一個返回值,針對參數生成一個返回值 |