php網(wǎng)站開發(fā)代碼東莞做網(wǎng)站最好的是哪家
Lambda 表達式
文章目錄
- Lambda 表達式
- 什么是 Lambda 表達式?
- 怎么使用?
- 1 基本語法:
- 2 箭頭符號:
- 3 代碼演示:
- 4 注意事項
- 函數(shù)式接口
- 1 什么是函數(shù)式接口
- 2 常見函數(shù)式接口
- 方法引用(了解)
- 1 什么是方法引用
什么是 Lambda 表達式?
Lambda表達式:特殊的匿名內(nèi)部類,語法更簡潔。
- 允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為方法參數(shù)傳遞),將代碼像數(shù)據(jù)一樣傳遞。
怎么使用?
1 基本語法:
<函數(shù)式接口> <變量名> = (參數(shù)1,參數(shù)2...) -> {//方法體};
2 箭頭符號:
->
(箭頭操作符), ->
將表達式分成兩部分
- 左側:(參數(shù)1,參數(shù)2…)表示參數(shù)列表
- 右側:{}內(nèi)部是方法體
3 代碼演示:
public class TestLambda {public static void main(String[] args) {//Lambda表達式:特殊的匿名內(nèi)部類,語法更簡潔。//示例1: Runnable接口//匿名內(nèi)部類:Runnable runnable1 = new Runnable() {@Overridepublic void run() {System.out.println("子線程1 開始執(zhí)行...");}};//簡化: Lambda表達式Runnable runnable2 = ()->{System.out.println("子線程2 開始執(zhí)行...");};//使用new Thread(runnable1).start();new Thread(runnable2).start();//簡寫: 方法體只有一行代碼時new Thread(()-> System.out.println("子線程3 開始執(zhí)行..."));//示例2: Comparator比較器//匿名內(nèi)部類Comparator<Integer> cmp1 = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}};//簡化: Lambda表達式Comparator<Integer> cmp2 = (o1, o2) -> o1 - o2;TreeSet<Integer> treeSet1 = new TreeSet<>(cmp1);TreeSet<Integer> treeSet2 = new TreeSet<>(cmp2);}
}
IDEA 快捷鍵:
- 在可以使用 Lambda表達式的位置, 按住 Alt + Enter , 即可將原代碼用 Lambda表達式書寫
4 注意事項
- 形參列表的數(shù)據(jù)類型會自動推斷。
- 如果形參列表為空,只需保留() 。
- 如果形參只有1個,()可以省略,只需要參數(shù)的名稱即可。
- 如果執(zhí)行語句只有一句,且無返回值,{}可以省略,
若有返回值,則若想省去{},則必須同時省略return,且執(zhí)行語句也保證只有一句。 - Lambda不會生成一個單獨的內(nèi)部類文件。
函數(shù)式接口
1 什么是函數(shù)式接口
- 如果一個接口只有一個抽象方法,則該接口稱之為函數(shù)式接口,函數(shù)式接口可以使用Lambda表達式,Lambda表達式會被匹配到這個抽象方法上 。
- @FunctionalInterface 注解檢測接口是否符合函數(shù)式接口。
代碼示例:
interface:
@FunctionalInterface //函數(shù)式接口: 只有一個抽象方法
public interface Usb {void service();
}
Test:
public class TestUsb {public static void main(String[] args) {//匿名內(nèi)部類Usb usb1 = new Usb() {@Overridepublic void service() {System.out.println("連接成功, 開始工作...");}};//Lambda表達式Usb usb2 = () -> System.out.println("連接成功, 開始工作...");}
}
2 常見函數(shù)式接口
函數(shù)式接口 | 參數(shù)類型 | 返回類型 | 說明 |
---|---|---|---|
Consumer<T> 消費型接口 | T | void | void accept(T t);對類型為T的對象應用操作 |
Supplier<T> 供給型接口 | 無 | T | T get(); 返回類型為T的對象 |
Function<T,R> 函數(shù)型接口 | T | R | R apply(T t);對類型為T的對象應用操作,并返回類型為R類型的對象。 |
Predicate<T> 斷言型接口 | T | boolean | boolean test(T t);確定類型為T的對象是否滿足條件,并返回boolean類型。 |
TestConsumer:
public class TestConsumer {public static void main(String[] args) {//匿名內(nèi)部類happy(new Consumer<Double>() {@Overridepublic void accept(Double money) {System.out.println(("聚餐吃飯, 花費:"+ money));}},1000);//Lambda表達式happy(money-> System.out.println("聚餐吃飯, 花費:"+money),2000);}public static void happy(Consumer<Double> consumer, double money) {consumer.accept(money);}
}
TestSupplier:
public class TestSupplier {public static void main(String[] args) {//匿名內(nèi)部類//獲取5個100以內(nèi)的隨機數(shù)int[] nums1 = getNums(new Supplier<Integer>() {@Overridepublic Integer get() {return new Random().nextInt(100);}},5);System.out.println(Arrays.toString(nums1));//Lambda表達式//獲取10個1000以內(nèi)的隨機數(shù)System.out.println(Arrays.toString(getNums(() -> new Random().nextInt(1000),10)));}public static int[] getNums(Supplier<Integer> supplier, int length) {int[] arr = new int[length];for (int i = 0; i < arr.length; i++) {arr[i] = supplier.get();}return arr;}
}
TestFunction:
public class TestFunction {public static void main(String[] args) {//匿名內(nèi)部類String s1 = handleString(new Function<String, String>() {@Overridepublic String apply(String s) {return s.toUpperCase();}}, "hello");System.out.println(s1);//Lambda表達式System.out.println(handleString(s -> s.toLowerCase(),"HELLO"));}public static String handleString(Function<String, String> function, String s) {return function.apply(s);}
}
TestPredicate:
public class TestPredicate {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("張三");list.add("張三鋒");list.add("張耕耘");list.add("韓羽");list.add("張利");list.add("田美麗");//匿名內(nèi)部類List<String> list1 = filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("張");}}, list);System.out.println(list1);//Lambda 表達式List<String> list2 = filter(s -> s.startsWith("田"), list);System.out.println(list2);}public static List<String> filter(Predicate<String> p, List<String> src) {ArrayList<String> list = new ArrayList<>();for (String s : src) {if (p.test(s)){list.add(s);}}return list;}
}
方法引用(了解)
1 什么是方法引用
- 方法引用是Lambda表達式的一種簡寫形式。
- 如果Lambda表達式方法體中只是調(diào)用一個特定的已經(jīng)存在的方法
- 這個方法的參數(shù)和返回值和接口中的方法的參數(shù)和返回值保持一致
代碼演示:
形式1 : 對象::實例方法
public class TestMethodRef {public static void main(String[] args) {Consumer<String> consumer1 = s -> System.out.println(s);Consumer<String> consumer2 = System.out::println;consumer1.accept("xxx");consumer2.accept("yyy");}
}res:
xxx
yyy