首页 > Java > java教程 > 实际应用中的 Lambda 表达式

实际应用中的 Lambda 表达式

Patricia Arquette
发布: 2025-01-07 08:12:40
原创
691 人浏览过

As expressões lambda em ação

一些将 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

  • lambda 表达式必须与您实现的抽象方法兼容。

不兼容示例:

  • 如果预期返回类型为 double,则不能使用 String 值。

  • 需要参数的方法如果不提供参数就无法使用。

  • 函数式接口可以与任何兼容的 lambda 表达式一起使用。

示例 3 - NumericTest

整除性测试: 检查第一个数字是否能被第二个数字整除。
大小比较: 确定第一个数字是否小于第二个数字。
绝对值比较:如果两个数字的绝对值相等,则返回 true。

  • 在 main() 中,使用 lambda 表达式创建三个不同的测试。

// 带有两个参数 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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板