lambda表达式是java8最具代表性的特性,它是衔接java语言与函数式编程思想的一道桥梁,它给java编程带来革命性的变化。
先来看几段代码, 对照感受一下:
1、创建线程
// 传统的匿名内部类方式 Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("Hello world!"); } }); // lambda表达式方式 Thread t2 = new Thread(() -> System.out.println("Hello java8"));
2、通过实现Comparator接口排序
1 List<String> list = Arrays.asList("java", "go", "python", "c++"); 2 // 传统排序写法 3 Collections.sort(list, new Comparator<String>() { 4 @Override 5 public int compare(String s1, String s2) { 6 return s1.compareTo(s2); // 按照字典顺序, 升序排列 7 } 8 }); 9 10 System.out.println("sorted asc: " + list); 11 Collections.shuffle(list); // 打乱 12 System.out.println("shuffled: " + list); 13 14 // lambda方式(带参数类型) 15 Collections.sort(list, (String s1, String s2) -> s1.compareTo(s2)); 16 System.out.println("sorted asc: " + list); 17 // lambda方式(不带参数类型) 18 Collections.sort(list, (s1, s2) -> s2.compareTo(s1)); 19 System.out.println("sorted desc: " + list);
结果:
sorted asc: [c++, go, java, python] shuffled: [c++, java, python, go] sorted asc: [c++, go, java, python] sorted desc: [python, java, go, c++]
3、swing编程里的事件绑定
// 传统方式绑定事件 button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { System.out.println("Add button clicked"); } }); // lambda 方式绑定事件 button.addActionListener(e -> System.out.println("click"));
结论:
暂且不讨论起编译和运行效率,只从代码的感官层面说:
优点: 代码量减少,代码变得更加精简, 能够节省一定的编码时间;样板性的代码被屏蔽。
确点: 缺省了变量类型,会给代码阅读带来不便,如案例3中的变量e,如果不结合调用的上下文,很难一眼看出是ActionEvent类型。