Java Lambda表达式
admin
2024-03-28 22:27:36
0

Lambda 表达式(Lambda expression)是一个匿名函数,基于数学中的λ演算得名,也可称为闭包(Closure)。现在很多语言都支持 Lambda 表达式,如 C++、C#、Java、 Python 和 JavaScript 等。

Lambda 表达式是推动 Java 8 发布的重要新特性,它允许把函数作为一个方法的参数(函数作为参数传递进方法中),下面通过例 1 来理解 Lambda 表达式的概念。

例 1

先定义一个计算数值的接口,代码如下:

// 可计算接口
public interface Calculable {// 计算两个int数值int calculateInt(int a, int b);
}

Calculable 接口只有一个方法 calculateInt,参数是两个 int 类型,返回值也是 int 类型。实现方法代码如下:

public class Test{/*** 通过操作符,进行计算** @param opr 操作符* @return 实现Calculable接口对象*/public static Calculable calculate(char opr) {Calculable result;if (opr == '+') {// 匿名内部类实现Calculable接口result = new Calculable() {// 实现加法运算@Overridepublic int calculateInt(int a, int b) {return a + b;}};} else {// 匿名内部类实现Calculable接口result = new Calculable() {// 实现减法运算@Overridepublic int calculateInt(int a, int b) {return a - b;}};}return result;}
}

方法 calculate 中 opr 参数是运算符,返回值是实现 Calculable 接口对象。代码第 13 行和第 23 行都采用匿名内部类实现 Calculable 接口。代码第 16 行实现加法运算。代码第 26 行实现减法运算。

public static void main(String[] args) {int n1 = 10;int n2 = 5;// 实现加法计算Calculable对象Calculable f1 = calculate('+');// 实现减法计算Calculable对象Calculable f2 = calculate('-');// 调用calculateInt方法进行加法计算System.out.println(n1 + "+" + n2 + "=" + f1.calculateInt(n1, n2));// System.out.printf("%d + %d = %d \n", n1, n2, f1.calculateInt(n1, n2));// 调用calculateInt方法进行减法计算System.out.println(n1 + "-" + n2 + "=" + f1.calculateInt(n1, n2));// System.out.printf("%d - %d = %d \n", n1, n2, f2.calculateInt(n1, n2));
}

代码第 5 行中 f1 是实现加法计算 Calculable 对象,代码第 7 行中 f2 是实现减法计算 Calculable 对象。代码第 9 行和第 12 行才进行方法调用。

上述代码中列出了两种输出方式,下面简单介绍一下 Java 中常见的输出函数:

  1. printf 主要继承了C语言中 printf 的一些特性,可以进行格式化输出。
  2. print 就是一般的标准输出,但是不换行。
  3. println 和 print 基本没什么差别,就是最后会换行。

输出结果如下:

10+5=15
10-5=15

例 2 使用匿名内部类的方法 calculate 代码很臃肿,Java 8 采用 Lambda 表达式可以替代匿名内部类。修改之后的通用方法 calculate 代码如下:

/**
* 通过操作符,进行计算
* @param opr 操作符
* @return 实现Calculable接口对象
*/
public static Calculable calculate(char opr) {Calculable result;if (opr == '+') {// Lambda表达式实现Calculable接口result = (int a, int b) -> {return a + b;};} else {// Lambda表达式实现Calculable接口result = (int a, int b) -> {return a - b;};}return result;
}

代码第 10 行和第 15 行用 Lambda 表达式替代匿名内部类,可见代码变得简洁。通过以上示例我们发现,Lambda 表达式是一个匿名函数(方法)代码块,可以作为表达式、方法参数和方法返回值。

Lambda 表达式标准语法形式如下:

(参数列表) -> {// Lambda表达式体
}

->被称为箭头操作符或 Lambda 操作符,箭头操作符将 Lambda 表达式拆分成两部分:

  • 左侧:Lambda 表达式的参数列表。
  • 右侧:Lambda 表达式中所需执行的功能,用{ }包起来,即 Lambda 体。

Java Lambda 表达式的优缺点:

优点:

  1. 代码简洁,开发迅速
  2. 方便函数式编程
  3. 非常容易进行并行计算
  4. Java 引入 Lambda,改善了集合操作(引入 Stream API)

缺点:

  1. 代码可读性变差
  2. 在非并行计算中,很多计算未必有传统的 for 性能要高
  3. 不容易进行调试

函数式接口

Lambda 表达式实现的接口不是普通的接口,而是函数式接口。如果一个接口中,有且只有一个抽象的方法(Object 类中的方法不包括在内),那这个接口就可以被看做是函数式接口。这种接口只能有一个方法。如果接口中声明多个抽象方法,那么 Lambda 表达式会发生编译错误:

The target type of this expression must be a functional interface

这说明该接口不是函数式接口,为了防止在函数式接口中声明多个抽象方法,Java 8 提供了一个声明函数式接口注解 @FunctionalInterface,示例代码如下:

// 可计算接口
@FunctionalInterface
public interface Calculable {// 计算两个int数值int calculateInt(int a, int b);
}

在接口之前使用 @FunctionalInterface 注解修饰,那么试图增加一个抽象方法时会发生编译错误。但可以添加默认方法和静态方法。

@FunctionalInterface 注解与 @Override 注解的作用类似。Java 8 中专门为函数式接口引入了一个新的注解 @FunctionalInterface。该注解可用于一个接口的定义上,一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样。

提示:Lambda 表达式是一个匿名方法代码,Java 中的方法必须声明在类或接口中,那么 Lambda 表达式所实现的匿名方法是在函数式接口中声明的。

Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

相关内容

热门资讯

为何投资者会轻信伪财经大V荐股... “伪财经大V”荐股骗局系列调查 第3期从证监会罚没超8300万元的重磅罚单,到雪球、抖音等平台掀起专...
“00后”上任A股公司董事长、... 2月7日,鸿铭股份(SZ301105,市值26.37亿元)发布关于选举公司第四届董事会董事长、各专门...
8部门“攥指成拳”强监管,合力... 刷短视频弹出“投资稳定币保本保息”的诱人广告,亲友群里转发“海外理财捷径”,朋友圈看到“资产代币化能...
仓库里存着4吨黄金,却硬说没钱... 一家百年珠宝企业,身怀价值数十亿的黄金库存,却因一笔相对不大的债务陷入违约漩涡,宁愿承受司法冻结、监...
突发!刘强东拿下中兴 订阅 快刀财经 ▲ 做您的私人商学院这场仗,刘强东输不起。作者:李东阳来源:李东阳朋友圈(ID:LD...
AI之争成了“外卖大战”,千问... “一代人有一代人的鸡蛋要领。”2月6日上午,下载千问并用1分钱买到一杯奶茶后,陈平(化名)和同事们分...
萃华珠宝的股票将于2月9日停牌... 新京报贝壳财经讯 2月7日,萃华珠宝发布公告称,因资金紧张,流动性短缺,公司及子公司多笔金融机构贷款...
5年耗资74亿元吞下四川大型锂... 木绒锂矿。图源:盛新锂能官网本报(chinatimes.net.cn)记者胡雅文 北京报道木绒锂矿采...
新款理想L9亮相,李想需要复制... 出品|虎嗅汽车组作者|王亚骏头图|视觉中国理想的新武器亮相了。2月6日,理想汽车CEO李想在微博上发...
新商业周报 | 美团收购叮咚买... 《CBNData新商业周报》精选本周新商业领域最新动态,公司头条、消费风向、智能创新、营销动态、可持...