JDK8新特性二:jdk8之Lambda表達式
函數式編程和Lambda表達式
- 函數式編程:可以理解爲將一個函數作爲參數值進行傳遞。
- 面向對象是對數據的抽象,即:各種各樣的pojo類。函數式編程則是對行爲的抽象,將行爲作爲一個參數進行傳遞。
jdk8之前和jdk8之後線程創建的對比
- jdk8之前創建線程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("你好~");
}
}).start();
- jdk8之後創建方法體,使用Lambda
//一個(),一個箭頭->指向方法體,整個叫做一個函數。
new Thread(()-> System.out.println("你好啊~")).start();
//也可以這樣
new Thread(()->{
System.out.println("你好啊~")
} ).start();
//花括號li可以加很多邏輯
- jdk8之前的list排序比較
List<String> list=Arrays.asList("aaa","ggg","ffff","ccc");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
for(String string:list){
System.out.println(string);
}
- jdk8之後的list排序比較
List<String> list2=Arrays.asList("aaa","ggg","ffff","ccc");
Collections.sort(list2,(a,b)->b.compareTo(a));
for(String string:list2){
System.out.println(string);
}
Lambda的使用場景
- 使用場景:
一個接口中只包含一個方法,則可以使用Lambda表達式,這樣的接口稱爲"函數接口"
(parames)->expression
第一個部分爲:括號內用逗號分割的形式參數,參數是函數式接口裏面的方法的參數。第二部分爲一個箭頭符號:->;第三部分爲方法體,可以是表達式和代碼塊。 例如:new Thread(new Runable()),裏面傳遞了一個Runable()對象,但是Runable()對象裏面只有一個方法run(),這時就可以不用寫這個Runable(),直接用()代替run()方法。
參數列表:
括號中參數列表的數據類型可以省略不寫。 括號中的參數只有一個,那麼參數類型和()都可以省略不寫。
方法體:
如果{}中的代碼只有一行,無論是否有返回值,可以省略{}、return、和分號,要一起省略。否則要都要加上去。也就是說花括號、和分號、和return(如果需要return語句)要有都有,要沒有都沒有。
Lambda表達式的好處:
Lambda表達式的實現方式在本質上是以匿名內部類的方式實現的。重構臃腫代碼,提高開發效率。
Lambda表達式自定義Lambda接口編程
- 定義 一個函數式接口,需要標註此接口@FunctionalInterface,否則萬一團隊成員在接口上加了其他方法則容易出現故障。
- 編寫一個方法,輸入需要操作的數據和接口。
- 在調用方法時傳入數據和lambda表達式,用來操作數據。
注意: 函數式編程和lambda表達式是一起的,沒有函數式編程也就沒有lambda表達式。
第一步:
@FunctionalInterface
public interface OperFunction<R,T> {
R operation(T t1,T t2);
}
第二步:
public static void main(String[] args) throws IOException {
System.out.println(operator(20,5,(Integer x,Integer y)->{
return x*y;
}));
System.out.println(operator(20,5,(x,y)->x+y));
System.out.println(operator(20,5,(x,y)->x-y));
System.out.println(operator(20,5,(x,y)->x/y));
}
//這個方法就是函數式編程,將OperFunction<Integer,Integer>當成參數傳進去。
public static Integer operator(Integer x, Integer y, OperFunction<Integer,Integer> of){
return of.operation(x,y);
}