一些将 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中文网其他相关文章!