6.3.1 lambda 表达式是一个可传递的代码块,可以在以后执行一次或者多次。

思考(如何按指定时间间隔完成工作,将这个工作放在一个ActionListener的actionPerformed方法中:)

class Worker implements ActionListener
{
public void actionPerformed(ActionEvent event )
{
//do some work
}
}

想要反复执行这个代码,可以构造Worker类的一个实例,然后把这个实例提交到一个Timer对象。这里的重点是actionPerformed方法包含希望以后执行的代码。

思考(如何用一个定制比较器完成排序。想要按长度而不是默认的字典顺序对字符串排序对字符串排序,可以向sort方法传入一个Comparator对象:)

class lengthComparator implements Comparator<String>
{
public int compare(String first,String second)
{
return first.length()-second.length();
}
}
...
Arrays.sort(strings,new lengthComparator());

共同点:都是将一个代码块传递到某个对象(一个是定时器,或者一个sort方法)。这个代码快会在将来某个时间调用。

6.3.2 lambda表达式的语法

(String first,String second)
      ->first.length()-second.length()

这是我看到的第一个lambda表达式,lambda表达式就是一个代码块,必须传入代码的变量规范。

--------带参数变量的表达式就被称为Lambda表达式。

-------------------------表达式形式,参数,箭头(->)以及一个表达式。如果代码要完成的计算无法放在一个表达式中,就把这些代码放在{}中,并包含显示的return语句。如:

(String first,String second)->{
if(first.length()<second.length()) return -1;
else if (first.length()>second.length()) return 1;
else return 0;
}

即使lambda表达式没有参数,任然需要空括号,就像无参数方法一样:

( ->) {for(int i=100;i>=0;i--) System.out.println(i); }

如果可以推导出lambda表达式的参数类型,则可以忽略其类型。如:

Comparator<String> comp
=(first,second)
->first.length()>second.length();

如果方法只有一个参数,而且这个参数的类型可以推导得出,那么还可以省略小括号;

ActionListener listener =event->
System.out.println("The time is "+new Data());

无需指定lambda表达式的返回类型。lambda表达式的返回类型总是会由上下文推导得出。如:

(String first,String second)->first.length()-second.length()

上面的可以在需要int类型结果的上下文中使用。

下例程序显示了如何在一个比较器和一个动作监听器中使用lambda表达式。

 package cc.openhome;
import java.awt.Toolkit;
import java.util.Arrays;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.Timer;
public class LambdaTest {
public static void main(String[] args) {
// TODO code application logic here
String[] planets =new String[] {"Yi","Er","San","Si","Wu","Liu","Qi","Ba"};
System.out.println(Arrays.toString(planets));
System.out.println("Sortd in dictionary order:");
Arrays.sort(planets);
System.out.println(Arrays.toString(planets));
System.out.println("Sorted by length:");
Arrays.sort(planets,(first,second) -> first.length()-second.length());
System.out.println(Arrays.toString(planets));
Timer t =new Timer (1000,event -> {System.out.println("The time is "+new Date());Toolkit.getDefaultToolkit().beep();});
t.start();
JOptionPane.showMessageDialog(null, "Quit programe?");
}
}
[Yi, Er, San, Si, Wu, Liu, Qi, Ba]
Sortd in dictionary order:
[Ba, Er, Liu, Qi, San, Si, Wu, Yi]
Sorted by length:
[Ba, Er, Qi, Si, Wu, Yi, Liu, San]
The time is Wed Mar 21 10:00:34 CST 2018
The time is Wed Mar 21 10:00:35 CST 2018
The time is Wed Mar 21 10:00:36 CST 2018
The time is Wed Mar 21 10:00:37 CST 2018
The time is Wed Mar 21 10:00:38 CST 2018
The time is Wed Mar 21 10:00:39 CST 2018
The time is Wed Mar 21 10:00:40 CST 2018
The time is Wed Mar 21 10:00:41 CST 2018
成功构建 (总时间: 8 秒)

run:

最新文章

  1. MBR结构和DBR结构
  2. uva116
  3. [z]查找锁表并解锁
  4. codeforces 719C (复杂模拟-四舍五入-贪心)
  5. HOW TO BE SINGLE 最后那段的摘录
  6. [ActionScript 3.0] AS3 3D双圆环贴图
  7. C# chart,有关如何在鼠标移动到Series上时显示节点及数据 (有待继续更新)
  8. (转)Xcode 中设置部分文件ARC支持
  9. 最长公共子序列问题 (LCS)
  10. JS复习:第二十章
  11. nodeppt的使用教程
  12. 剑指Offer——网易笔试题+知识点总结
  13. tr1
  14. xftp无法用root账号登录问题
  15. [OpenCV]直线拟合
  16. 压测工具之JMeter之环境配置及运行
  17. 【python基础】sys
  18. 前端通过js-xlsx获取Excel完整数据
  19. TCP连接的TIME_WAIT过多导致 Tomcat 假死
  20. vijos 1096 津津的储存计划

热门文章

  1. HDOJ-2045
  2. dockerfile创建镜像(二)
  3. python 之 staticmethod,classmethod,property的区别
  4. 技术胖Flutter第三季-17布局PositionedWidget层叠定位组件
  5. ZOJ3166【找环值最小】
  6. 51nod 1051【基础】
  7. Linux系统查看网站访问日志
  8. SVN有任何胜过git的地方吗?
  9. 序列化 jprotobuf
  10. Caffe实战五(Caffe可视化方法:编译matlab接口)