使用Lambda的函数式编程
曾经,大多数开发者发现他们需要集合能够执行如下一种或几种操作:
1、创建一个新的集合对象,但要过滤掉不符合条件的元素。
2、对集合中的元素逐一进行转化,并使用转化后的集合。
3、创建集合中所有元素的某个属性的总体值,例如,合计值与平均值。这样的任务(分别称之为过滤,映射和化简)具有共通的要点:它们都需要处理集合中的每个元素。
程序无论是判定某个元素是否存在,或是判断元素是否符合某个条件(过滤),或是将元素转化成新元素并生成新集合(映射),或是计算总体值(化简),关键原理就是“程序必须处理到集合中的每个元素”。
这就暗示我们需要一种简单的途径去表示用于内部遍历的程序。幸运地是,Java SE 8为此类表示法提供了构建语句块。
支持基本函数式编程的Java SE 8类
Java SE 8中的一些类意在被用于实现前述的函数式典范,这些类包括Predicate,Mapper和Block--当然,还有其它的一些类--它们都在一个新的java.util.functions包中。
看看Predicate类的更多细节,该类常被用于实现过滤算法;将它作用于一个集合,以返回一个包含有符合谓语条件元素的新集合。何为谓语,有很多种解释。Java SE 8认为谓语是一个依据其变量的值来判定真或假的方法。
再考虑一下我们之前看过的一个例子。给定一个字符串的集合,我们想判定它是否包含有指定的字符串,但希望字符串的比较是大小写不敏感的。
在Java SE 7中,我们将需要使用外部遍历,其代码将如清单8所示,
清单8
|
而在即将发布的Java SE 8中,我们使用Predicate以及Collections类中一个新的助手方法(过滤器)就可写出更为紧凑的程序,如清单9所示,
清单9
|
事实上,如果使用更为通用的函数式编程风格,你只需要写一行代码,如清单10所示,
清单10
|
如你所见,代码依然非常的易读,并且我们也体会到了使用内部遍历的好处。
最后,让我们讨论一下Lambda表达式语法的更多细节。
Lambda表达式的语法规则
Lambda表达式的基本格式是以一个可被接受的参数列表开头,以一些代码(称之为表达式体/body)结尾,并以箭头(->)将前两者分隔开。
注意:Lambda表达式的语法仍可能会面临改变,但在撰写本文的时候,下面示例中所展示的语法是能够正常工作的。