【软件构造】Java8 Lambda表达式的个人见解

由于个人技术栈的关系,我较多使用C++、C#、Python和JavaScript/TypeScript语言编写程序,这些语言的较新版本都加入了Lambda表达式(JS中较为正式的名称为“箭头函数”,Arrow function),用来拓展其函数式编程的能力。我在这些语言中经常使用Lambda表达式,并运用函数式编程的思想,开发效率得到了很大的提升,我也从中获得了无穷的快感。然而,相对来说,我使用Java并不算太多,只知道Java 1.8(现在直接称为Java8)中加入了Lambda表达式。在软构实验中,我也尝试运用Lambda表达式来代替传统的函数定义,却发现与其他语言不同,Java中Lambda表达式与普通函数并不具有对等的地位;相反,Java中的Lambda表达式创建的是一个函数式接口的对象。

我们首先来了解一下什么是“函数式接口”。如果对于函数式编程比较熟悉的话,通过它的名字,我们就能大概猜到它的含义:“这种接口应该定义了一个函数成员,它有特定的参数类型和返回类型”。事实上,的确如此。我们来看Oracle的JavaSE 8文档:

Conceptually, a functional interface has exactly one abstract method.

而java.util.function包中则预置了多种类型的函数式接口,供我们选用。

当然,我要承认,我觉得Java中这种Lambda表达式使用起来并不够灵活。我认为,归根到底,这种“不灵活”是因为Java语言设计中的面向对象思想占绝对主导地位,而其对函数式编程思想的吸纳有限;它没有提供与C#中委托类型等价的类型,或者与C++中函数指针/function类型等价的类型,因而函数类型无法成为Java中的“一等公民”。

以软构实验2为例,实现类的checkRep方法时,如果我们使用其他语言,可以很自然地将它写成一个简洁的Lambda表达式,但在Java中则需要以正常的方式定义函数。但是,我们仍然可以在其他地方成功运用Lambda表达式与函数式编程的思想,例如在ConcreteVerticesGraph类的add方法中,就可以用这种方式简洁地检查给定的顶点是否已存在:

 

个人希望Java能在未来更好地支持函数式编程,提高广大开发人员的开发效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值