一些將 lambda 表達式的基本概念付諸實踐的簡單範例:
範例 1 - 不使用 lambda 和使用 lambda 的實作比較
不使用 lambda:
MyValueSemLambda1 介面 {
雙 getValue(); // 抽象方法
}
類別 MyValueImpl 實作 MyValueSemLambda1{
私有雙值;
// 初始化 value
屬性的建構子
public MyValueImpl(雙值) {
this.value = 值;
}
// getValue方法的實作
@覆蓋
公雙 getValue() {
返回 this.value;
}
}
公共類別 MyValueSemLambda {
public static void main(String[] args) {
MyValueSemLambda1 myVal = new MyValueImpl(98.6); // 給屬性
賦值
System.out.println("值:" myVal.getValue()); // 印出 98.6
}
}
使用 lambda:
MyValueCompare 介面 {
double getValue();
}
公共類別 MyValueComparacao {
public static void main(String[] args) {
// 沒有屬性但傳回值的 Lambda 表達式
MyValueCompares myVal = () ->; 98.6;
System.out.println("值:" myVal.getValue()); // 印出 98.6
}
}
範例 2 - LambdaDemo
// 函數式介面。
介面 MyValue {
double getValue();
}
// 另一個函數式介面。
介面 MyParamValue {
雙 getValue(雙 v);
}
LambdaDemo 類別 {
public static void main(String args[])
{
我的值我的值; // 宣告一個介面引用
// 這裡,lambda 表達式只是一個常數表達式。
// 當賦值給myVal時,實例
被建構
// lambda 表達式實作
的類
// MyValue 的 getValue() 方法。
myVal = () ->; 98.6;一個簡單的 lambda 表達式
// 呼叫 getValue(),它是由
提供
// 先前指派的 lambda 表達式。
System.out.println("常數值:" myVal.getValue());
// 現在建立一個參數化 lambda 表達式並為其賦值
// 用於 MyParamValue 引用。此 lambda 表達式回傳
// 其參數的倒數。
MyParamValue myPval = (n) ->; 1.0/n; lambda 表達式
它有一個參數
// 透過 myPval 引用呼叫 getValue()。
System.out.println("4的倒數是" myPval.getValue(4.0));
System.out.println("8的倒數是" myPval.getValue(8.0));
// lambda 表達式必須與定義的方法相容
// 透過函數介面。因此,這些說明將無法運作:
// myVal = () ->; “三”; // 錯誤!字串與雙精度不相容!
// myPval = () ->;數學.隨機(); // 錯誤!此參數為必填項!
}
}
輸出:
恆定值:98.6
4 的倒數是 0.25
8 的倒數是 0.125
不相容範例:
如果預期回傳類型為 double,則不能使用 String 值。
需要參數的方法如果不提供參數就無法使用。
函數式介面可以與任何相容的 lambda 表達式一起使用。
範例 3 - NumericTest
整除性檢定: 檢查第一個數字是否能被第二個數字整除。
大小比較: 決定第一個數字是否小於第二個數字。
絕對值比較:如果兩個數字的絕對值相等,則傳回 true。
// 帶有兩個參數 int 和
的函數接口
// 傳回一個布林結果。
介面 NumericTest {
布林測試(int n, int m);
}
類別 LambdaDemo2 {
public static void main(String args[])
{
// 這個 lambda 表達式判斷是否為一個數字
// 是另一個因素的一個因素。
數值測試 isFactor = (n, d) -> (n % d) == 0;
if(isFactor.test(10, 2))
System.out.println("2是10的因數");
if(!isFactor.test(10, 3))
System.out.println("3不是10的因數");
System.out.println();
// 如果
該 lambda 表達式傳回 true
// 第一個參數小於第二個參數。
NumericTest 小於 = (n, m) -> (n
if(lessThan.test(2, 10))
System.out.println("2小於10");
if(!lessThan.test(10, 2))
System.out.println("10不小於2");
System.out.println();
// 如果您
,則此 lambda 表達式傳回 true
// 參數的絕對值相等。
NumericTest 絕對等於 = (n, m) -> (n
if(absEqual.test(4, -4))
System.out.println("4和-4的絕對值相等。");
if(!lessThan.test(4, -5))
System.out.println("4和-5的絕對值不相等。");
System.out.println();
}
}
輸出:
2 是 10 的因數
3 不是 10 的因數
2 小於 10
10 不小於 2
4和-4的絕對值相等。
4和-5的絕對值不相等。
相容的 lambda 表達式可以與相同的函數介面一起使用。
相同的引用變數可以重複用於不同的 lambda 表達式。
重複使用變數使閱讀更容易並節省程式碼資源。
在範例中,相同的介面用於不同的實作:
NumericTest myTest;
myTest = (n, d) ->; (n%d)==0; //實作1
if(myTest.test(10, 2))
System.out.println("2是10的因數");
// ...
myTest = (n, m) ->; (n<m); //實作2
if(myTest.test(2, 10))
System.out.println("2小於10");
//...
myTest = (n, m) ->; (n
if(myTest.test(4, -4))
System.out.println("4和-4的絕對值相等。");
// ...
參考變數的清晰度
使用不同的引用變數(例如 isFactor、lessThan、absEqual)可以幫助您清楚地識別每個變數代表哪個 lambda 表達式。
多參數規格
lambda 表達式中的多個參數在 lambda 運算子左側的括號列表中以逗號分隔。
例: (n, d) -> (n % d) == 0.
在 lambda 表達式中使用不同型別
函數式介面的抽象方法中,參數或傳回的型別沒有限制。
像 String 這樣的非原始資料類型可以在 lambda 表達式中使用。
使用字串進行測試的範例
函數式介面可用來測試特定的字串相關條件,例如檢查一個字串是否包含在另一個字串中。
// 測試兩個字串的函數介面。
介面 StringTest {
布林測試(String aStr, String bStr);
}
類別 LambdaDemo3 {
public static void main(String args[])
{
// 這個 lambda 表達式確定字串是否
// 另一個的一部分。
StringTest isIn = (a, b) ->; a.indexOf(b) != -1;
String str = "這是一個測試";
System.out.println("測試字串:" str);
if(isIn.test(str, "is a"))
System.out.println("找到''是'。");
其他
System.out.println("'是一個'未找到。");
if(isIn.test(str, "xyz"))
System.out.println("'xyz' 找到");
其他
System.out.println("未找到'xyz'");
}
}
輸出:
測試字串:這是一個測試
找到“是”。
找不到“xyz”
StringTest 函數介面
定義一個傳回布林值的抽象方法 test(String aStr, String bStr)。
使用 lambda 表達式實現
lambda 表達式 (a, b) -> a.indexOf(b) != -1 檢查字串 (b) 是否包含在另一個字串 (a) 中。
參數中的型別推論
參數a和b被推論為String類型,允許使用String類別的方法,例如indexOf。
程式測試字串“This is a test”,看看它是否包含子字串“is a”和“xyz”,並相應地列印結果。
以上是實際應用中的 Lambda 表達式的詳細內容。更多資訊請關注PHP中文網其他相關文章!