学 Java 函数式编程

Posted JAVA早餐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学 Java 函数式编程相关的知识,希望对你有一定的参考价值。

和 Lambda 表达式 Say Hello

如果用一大段枯燥的文字去解释一个我们并不熟悉的概念,我觉得和看天书并无区别。我之所以选择学编程,就是因为没有什么是写段代码不能搞定的。那么废话少说,大家先看看清单一中的代码。

清单一

学 Java 函数式编程(二)

清单 1

看完清单一中的代码,估计有人要说我了,因为这段代码在上一篇博客中已经出现过了。但这又何妨,通过一段简单的代码,我们可以挖掘很多知识。在清单一代码的 main 函数中,我调用了 add 函数,并使用了一个匿名内部类作为 add 函数的参数。匿名内部类被设计的目的之一就是,方便程序员将代码作为数据传递。

现在问题来了,大家有没有觉得这样的代码太过于冗余了。我们明明只需要 a + b 这一条语句,却附加了很多其他的代码(命令式代码)。可能由于大家已经习惯了这样的写法,但 Java8 让我们可以用更加简单的代码实现相同的功能。那么,我们一起来看清单二中用 Java8 实现地与清单一功能相同的代码。

清单二

学 Java 函数式编程(二)

清单 2

如果有人认为清单二中的代码看着不爽,那么我建议他可以去泡个澡,然后剪个头发。其实清单二中的代码我已经在上篇博客中展示了,但我并没有解释 () -> a + b 是几个意思。

我现在给大家分析下 () -> a + b ,其实这段代码就是一个 Lambda 表达式,也可以理解为一个函数。-> 将参数和 Lambda 表达式的主体分割开了,-> 的左边是参数所在的位置,()表示无参数;-> 右边的代码是 Lambda 表达式的主体。

即使我们知道了 add 函数中那段代码是什么意思,我认为有些人对于在 add 函数中直接传入一个 Lambda 表达式还是难以理解。那么现在我用另一种方式重写清单二中 main 函数中的代码,请看清单三。

清单三

学 Java 函数式编程(二)

清单 3

我相信清单三中的代码对于大家来说都很熟悉。当你无法理解使用 Lambda 表达式作为函数参数的用法,你们就将 Lambda 表达式理解为一个对象的引用,虽然按理来说我们不能这么来理解。

Lambda 表达式的多种形式

不带参数的 Lambda 表达式

清单四

学 Java 函数式编程(二)

清单 4

清单四中展示了一个不带参数的 Lambda 表达式,在 -> 的左边使用空括号 () 代表没有参数。

带一个参数的Lambda表达式

清单五

学 Java 函数式编程(二)

清单 5

清单五展示了一个只带一个参数的 Lambda 表达式,因为只有一个参数,所以参数可以用括号包裹起来,也可以不用。

带多个参数的 Lambda 表达式

清单六

学 Java 函数式编程(二)

清单 6

清单六中展示了一个带多个参数的 Lambda 表达式。因为有多个参数,所以需要用括号将多个参数包裹起来。

注意:我不能用惯性思维去阅读清单六中 Lambda 表达式。该 Lambda 表达式并不是将两个数字相加,而是创建了一个函数,用来计算两个数字相加的结果。变量 multiIArguments

的类型是 IMultiArguments<Integer>,它不是两个数字相加的和,而是将两个数字相加的那行代码。

主体用被{}包裹的 Lambda 表达式

清单七

学 Java 函数式编程(二)

清单 7

清单七中展示了,如果 Lambda 表达式的主体有多行代码,那么就需要将多行代码用**中括号 {} **包裹。其实当 Lambda 表达式的主体只有一行代码的时候,大家可以根据自己的习惯决定是否使用中括号。

通过 Lambda 表达式来看 Java8

既成事实地final变量

在我们学 Java 基础的时候,我们就知道匿名内部类只能引用外部的 final 变量。但我们却发现,被 Lambda 表达式引用的外部变量并没有被 final 修饰。如清单八中的代码所示,被 Lambda 表达式引用的外部变量 a 和 b 并诶有被 final 修饰,这是因为 Java8 为我们省去了一些操作,这样代码看上去会更加干净舒服。虽然 a 和 b 没有被显示地被 final 修饰,但它们依然是事实上的 final 变量。你们可以根据自己的喜好,选择性地给被 Lambda 表达式引用的外部变量加上 final 修饰符。


类型推断

不知大家是否有注意,本文中使用的 Lambda 表达式都没有为参数指明类型,这是因为 Java8 引入了比 Java7 更加强大的目标类型推断。如清单九中的代码所示, Lambda 表达式的参数 x 并没有被指明类型,但 javac 会根据变量 atLeast 的类型 Predicate<Integer> 推断出目标类型。在日常的开发中,请大家根据具体情况选择是否给 Lambda 表达式的参数显示地指明类型。

清单九


java海量视频资源免费获取、java最新资讯、新闻每日更新。

请长按图片,关注下方二维码

亲们,所有资源全部免费,视频均来源于网络,若发现个别资源失效,请及时联系早餐君,早餐君发现后会立即修改连接。你们的支持使我们坚持的动力!



以上是关于学 Java 函数式编程的主要内容,如果未能解决你的问题,请参考以下文章

谈谈 Java 对函数式编程的支持。

函数式编程,这样学就废了

Scala学习之函数式风格编程

前端学习之函数式编程—函数式编程概念+头等函数

函数式编程,这样学就废了

前端必学-函数式编程(六)