探索Java语言与JVM中的Lambda表达式

发表于:2013-1-06 09:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Sha Jiang    来源:51Testing软件测试网采编

  使用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

  1. public void printMatchedStrings(List<String> myStrings) {  
  2.     List<String> out = new ArrayList<>();  
  3.     for (String s: myStrings) {  
  4.         if (s.equalsIgnoreCase(possible))  
  5.             out.add(s);  
  6.     }  
  7.     log(out);  
  8. }

  而在即将发布的Java SE 8中,我们使用Predicate以及Collections类中一个新的助手方法(过滤器)就可写出更为紧凑的程序,如清单9所示,

  清单9

  1. public void printMatchedStrings() {  
  2.     Predicate<String> matched = s -> s.equalsIgnoreCase(possible);  
  3.     log(myStrings.filter(matched));  
  4. }

  事实上,如果使用更为通用的函数式编程风格,你只需要写一行代码,如清单10所示,

  清单10

  1. public void printMatchedStrings() {  
  2.     log(myStrings.filter(s -> s.equalsIgnoreCase(possible)));  
  3. }

  如你所见,代码依然非常的易读,并且我们也体会到了使用内部遍历的好处。

  最后,让我们讨论一下Lambda表达式语法的更多细节。

  Lambda表达式的语法规则

  Lambda表达式的基本格式是以一个可被接受的参数列表开头,以一些代码(称之为表达式体/body)结尾,并以箭头(->)将前两者分隔开。

  注意:Lambda表达式的语法仍可能会面临改变,但在撰写本文的时候,下面示例中所展示的语法是能够正常工作的。

43/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号