Java8 – Lambda運算式介紹
Lambda運算式,也可以稱為閉包,Lambda允許把函式作為一個方法的引數傳遞進方法中使用,
Lambda運算式的使用前提是:介面中只能有一個方法,否則編譯報錯
Multiple non-overriding abstract methods found in interface:在介面中找到多個非重寫的抽象方法
完整的Lambda運算式由三部分組成:1. 引數串列 ; 2. 箭頭(->) ; 3. 宣告陳述句 (+ 回傳陳述句)
(Type param1, Type param2, ..., TypeN paramN) -> { statment1; statment2; ...; return statmentN;}
Lambda 運算式主要用來定義行內執行的方法型別介面,同時,Lambda 運算式免去了使用匿名方法的麻煩,并且給予Java簡單但是強大的函式化的編程能力,
1. Lambda運算式的特征
可選型別宣告 :可以不宣告引數型別,編譯器能夠統一識別,
(param1, param2, ..., paramN) ->單引數可省略引數的圓括號 :一個引數無需圓括號,但多個引數需要使用圓括號,
param1 ->**
{}中只有一個陳述句可以省略大括號** :如果方法主體只有一個陳述句,就可以省略大括號,如果有多個陳述句,需要使用大括號,(param1, param2, ..., paramN) -> return statement1如果
{}中只有一個回傳值,則可以省略回傳關鍵字 :如果方法主體只有一個運算式回傳值則編譯器會自動確定回傳值,但是大括號需要指明運算式回傳一個數值,
2. 簡單案例
public class LambdaStudy {
/**
* 自定義介面IOperation
*/
interface IOperation {
/**
* 回傳兩個數的操作(加減乘除等)
* @param x 引數1
* @param y 引數2
* @return 回傳操作結果值
*/
int operation(int x, int y);
String getString(String str);
}
/**
* 字串操作介面
*/
interface StringOperation {
/**
* 回傳字串
* @param str 引數
* @return 回傳一個字串
*/
String getString(String str);
}
@Test
public void testLambda() {
//使用型別宣告(int)宣告 加法 運算 -- 可簡寫為 add = Integer::sum
IOperation add = (int x, int y) -> x + y;
//不使用型別宣告 減法 運算
IOperation subtract = (x, y) -> x - y;
//有大括號宣告 乘法 運算
IOperation multiply = (x, y) -> { return x * y; };
//不用括號宣告 除法 運算
IOperation divide = (x, y) -> x / y;
System.out.println("6 + 6 = " + add.operation(6,6));
System.out.println("6 - 6 = " + subtract.operation(6,6));
System.out.println("6 * 6 = " + multiply.operation(6,6));
System.out.println("6 / 6 = " + divide.operation(6,6));
//字串拼接輸出
StringOperation strOperation = str -> "lambda -> " + str;
System.out.println(strOperation.getString("hello"));
}
}
運行結果:
6 + 6 = 12
6 - 6 = 0
6 * 6 = 36
6 / 6 = 1
lambda -> hello
3. Lambda運算式在實際應用中簡潔化案例
例如:使用匿名內部類創建執行緒并運行
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread內部類方法run");
}
}).start();
使用lambda運算式來寫只需要一行代碼就鞥呢完成:
new Thread(() -> System.out.println("lambda方式創建執行緒")).start();
Lambda使用的是面向函式式編程的思想,一定程度上可以使代碼看起來更加簡潔,
4. 方法參考型別
Java8 Lambda運算式提供了集中型別的方法應用,主要是以下三種:
| 方法參考型別 | 描述 | 案例 |
|---|---|---|
| 物件::實體方法 | 將 lambda 的引數當做方法的引數來使用 | objectName::instanceMethod |
| 類::靜態方法 | 將 lambda 的引數當做方法的引數使用 | ClassName::staticMethod |
| 類::實體方法 | 將lambda的第一個引數當做方法的呼叫者,其他的引數作為方法的引數,(注意:開發中盡量少用這種寫法,減少后續維護成本) | ClassName::instanceMethod |
5. 建構式的使用
5.1 無參構造方法
Supplier<User> createUser1 = User::new;
//完整寫法
Supplier<User> createUser2 = () -> new User();
//通過get方法獲取物件
User user = createUser1.get();
User user = createUser2.get();
5.2 有參構造方法
User類
@Data
class User {
private String name;
private int age;
}
//一個引數,如果引數型別沒有對應的構造方法則會編譯出錯:Cannot resolve constructor
Function<String, User> param1 = User::new;
//等價于 可以加括號的寫法(name) -> 或者再加上對應的型別 (String name) ->
Function<String, User> param1_ = name -> new User(name);
User user = param1.apply("strive");
System.out.println(user);
運行結果:
User{name=‘strive’, age=0}
//兩個引數的構造方法
BiFunction<String, Integer, User> param2 = (name, age) -> new User(name, age);
//等價于
BiFunction<String, Integer, User> param2_ = User::new;
User user = param2.apply("strive", 21);
System.out.println(user);
運行結果:
User{name=‘strive’, age=21}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/251743.html
標籤:java
上一篇:遞回基礎練習(下)
