关闭

Java 8的Lambda表达式

发表于:2012-6-27 09:25

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

 作者:红薯    来源:51Testing软件测试网采编

  Java 8预计将在2013 年发布,Java 8将支持Lambda功能,尽管该规范还在不断的变化,但是Java 8的开发版已经实现了对Lambda的支持。

  关于 Lambda 表达式的定义请看维基百科。

  该文章将带你熟悉 Lambda 语法,以及使用集合 API 中的 Lambda 以及相关的语言增强,本文所有的代码都是在 JDK 8 Lambda build b39 编译。

  功能接口

  只包含一个方法的接口被称为功能接口,Lambda 表达式用用于任何功能接口适用的地方。

  java.awt.event.ActionListener 就是一个功能接口,因为它只有一个方法:void actionPerformed(ActionEvent). 在 Java 7 中我们会编写如下代码:

  1. button.addActionListener(new ActionListener() {   
  2.     public void actionPerformed(ActionEvent e) {   
  3.         ui.dazzle(e.getModifiers());  
  4.     }  
  5. });

  而 Java 8 中可以简化为:

button.addActionListener(e -> { ui.dazzle(e.getModifiers()); });

  编译器知道Lambda 表达式必须符合 void actionPerformed(ActionEvent) 方法的定义。看起来 Lambda 实体返回 void,实际上它可以推断出参数 e 的类型是 java.awt.event.ActionEvent.

  函数集合

  Java 8 的类库包含一个新的包 java.util.functions ,这个包中有很多新的功能接口,这些接口可与集合 API 一起使用。

  java.util.functions.Predicate

  使用谓词 (Predicate) 来筛选集合:

  1. List<String> names = Arrays.asList("Alice""Bob""Charlie""Dave");  
  2. List<String> filteredNames = names  
  3.         .filter(e -> e.length() >= 4)  
  4.         .into(new ArrayList<String>());  
  5. for (String name : filteredNames) {  
  6.     System.out.println(name);  
  7. }

  这里我们有两个新方法:

  ● Iterable<T> filter(Predicate<? super T>) 用于获取元素满足某个谓词返回 true 的结果

  ● <A extends Fillable<? super T>> A into(A) 将用返回的结果填充 ArrayList

  java.util.functions.Block

  我们可使用一个新的迭代器方法来替换 for 循环 void forEach(Block<? super T>):

  1. List<String> names = Arrays.asList("Alice""Bob""Charlie""Dave");  
  2. names  
  3.    .filter(e -> e.length() >= 4)  
  4.    .forEach(e -> { System.out.println(e); });

  forEach() 方法是 internal iteration 的一个实例:迭代过程在 Iterable 和 Block 内部进行,每次可访问一个元素。

  最后的结果就是用更少的代码来处理集合:

  1. List<String> names = Arrays.asList("Alice""Bob""Charlie""Dave");  
  2. names  
  3.    .mapped(e -> { return e.length(); })  
  4.    .asIterable() // returns an Iterable of BiValue elements 
  5.                  // an element's key is the person's name, its value is the string length 
  6.    .filter(e -> e.getValue() >= 4)  
  7.    .sorted((a, b) -> a.getValue() - b.getValue())  
  8.    .forEach(e -> { System.out.println(e.getKey() + '\t' + e.getValue()); });

  这样做的优点是:

  元素在需要的时候才进行计算

  如果我们取一个上千个元素的集合的前三条时,其他元素就不会被映射

  鼓励使用方法链

  我们无需才存储中间结果来构建新的集合

  内部迭代过程因此大多数细节

  例如,我们可以通过下面代码来并行 map() 操作

  writing myCollection.parallel().map(e ?> e.length()).

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号