Lambda運算式
Lambda運算式理解
-
Lambda運算式是Jdk 8 開始新增的一種語法形式;作用:用于簡化匿名內部類的代碼寫法

注意:Lambda運算式只能簡化函式式介面的匿名內部類!!!
什么是函式式介面?
-
有且僅有一個抽象方法的介面,
-
注意:大部分函式式介面,上面可能會有一個@FunctionalInterface的注解,有該注解的介面就必定是函式式介面,
Lambda運算式的省略寫法(進一步簡化Lambda運算式的寫法)
-
引數型別可以省略不寫,
-
l如果只有一個引數,引數型別可以省略,同時()也可以省略,
-
l如果Lambda運算式中的方法體代碼只有一行代碼,可以省略大括號不寫,同時要省略分號!此時,如果這行代碼是return陳述句,也必須去掉return關鍵字不寫,
上代碼
基于無參無回傳值,無參有回傳值,有參無回傳值,有參有回傳值
package com.itheima.yaoyao; ? import java.util.Random; ? public class LambdaDemo2 { public static void main(String[] args) { //基于匿名內部類呼叫useInterOne:分析有一個InterOne介面【快速創建介面的實作類物件】 怎么做! useInterOne(new InterOne() { @Override public void methodOne() { System.out.println("無參無返匿名內部類呼叫"); } }); ? ? //基于Lambda運算式呼叫useInterOne:分析(1)必須要傳遞InterOne介面實作類物件【省略】(2)必須要實作methodOne抽象方法【省略】 //methodOne方法的邏輯【不能!】傳遞methodOne方法的邏輯(剩余的事情由Java來做) 【基于Lambda運算式來做methodOne方法的邏輯載體】 useInterOne(()->{System.out.println("lambda運算式表示無參無返");}); ? ? //基于匿名內部類呼叫useInterTwo useInterTwo(new InterTwo() { @Override public Integer methodTwo() { return 100; } }); ? ? //基于Lambda運算式呼叫useInterTwo:分析(1)必須要傳遞InterTwo介面實作類物件【省略】(2)必須要實作methodTwo抽象方法【省略】 //methodTwo方法的邏輯【不能!】傳遞methodTwo方法的邏輯(剩余的事情由Java來做) 【基于Lambda運算式來做methodTwo方法的邏輯載體】 //如果Lambda實作的方法需要回傳值就要在{}中return回滿足要求的結果 ? useInterTwo(()->{ return new Random().nextInt(100); }); ? //基于匿名內部類呼叫useInterThree useInterThree(new InterThree() { @Override public void methodThree(String name, String food) { System.out.println(name+"愛喝"+food); } }); ? ? //基于Lambda運算式呼叫useInterThree:分析(1)必須要傳遞InterThree介面實作類物件【省略】(2)必須要實作methodThree抽象方法【省略】 //methodThree方法的邏輯【不能!】傳遞methodThree方法的邏輯(剩余的事情由Java來做) 【基于Lambda運算式來做methodThree方法的邏輯載體】 //如果Lambda運算式作為方法的載體,方法宣告了形式引數,在Lambda的()中也要宣告同樣形式引數 useInterThree( (String name,String food) ->{ System.out.println(name + "愛吃"+"小雞燉蘑菇"); }); ? ? //基于匿名內部類呼叫useInterFour useInterFour(new InterFour() { @Override public String methodFour(String foodOne, String foodTwo) { return foodOne+"燉"+foodTwo; } }); ? ? //基于Lambda呼叫 useInterFour((String foodOne, String foodTwo) ->{return foodOne + "炒"+ foodTwo ;}); ? } ? //撰寫4個方法分別將四個介面作為方法的引數【傳遞四個介面中不同型別的方法Lambda運算式】 //在撰寫方法的時候并不明確方法的具體邏輯是什么 【多型:傳遞進來的實作類的實作邏輯是什么,這里就執行什么邏輯】 public static void useInterOne(InterOne interOne) { interOne.methodOne(); } ? public static void useInterTwo(InterTwo interTwo) { Integer result = interTwo.methodTwo(); System.out.println("useInterTwo Result:" + result); } ? public static void useInterThree(InterThree interThree) { interThree.methodThree("張二狗", "西紅柿炒洋柿子"); } ? public static void useInterFour(InterFour interFour) { String result = interFour.methodFour("大蔥", "笨雞蛋"); System.out.println("useInterFour Result:" + result); } } ? @FunctionalInterface interface InterOne { //無參無回傳值的抽象方法 void methodOne(); } ? @FunctionalInterface interface InterTwo { //無參有回傳值的抽象方法 Integer methodTwo(); } ? @FunctionalInterface interface InterThree { //有參無回傳值的抽象方法 void methodThree(String name, String food); } ? @FunctionalInterface interface InterFour { //有參有回傳值的抽象方法 String methodFour(String foodOne, String foodTwo); } ?
