lamdba表达式是一个可传递的代码块,可以在以后执行一次或者多次。下面我们先来看看一个简单的lamdba表达式:
(String first,String second)->first.length()-second.length();
这里是一个简单的lamdba表达式。lamdba表达式就是一个代码块,以及必须传入代码的变量规范。带参数变量的表达式被称为lamdba表达式。
你已经见过Java中的lamdba表达式形式:参数,箭头(->)以及一个表达式。如果代码要完成的计算无法放在一个表达式中,就可以想写方法一样,把这些代码放在{}中,并包含显式的return语句。例如:
(String first,String second)->{
if(first.length()<second.length()) return -1;
else if(first.length()>second.length()) return 1;
else return 0;
}
即使lamdba表达式没有参数,仍然要提供空括号,就像空参方法一样。
()->{
for(int i=0;i<10;i++) System.out.println(i);
}
如果可以推导出一个lamdba表达式的参数类型,则可以忽略其类型。
如果方法只有一个参数,而且这个参数的类型可以推倒得出,那么甚至可以忽略小括号:
ActionListener listener = event ->
.println("The time is " + new Date()"); System.out
// Instead of (event) -> . . . or (ActionEvent event) -> . . .
无需指定 lambda 表达式的返回类型。 lambda 表达式的返回类型总是会由上下文推导得 出。 例如, 下面的表达式
(String first, String second) -> first.lengthO - second.lengthO
可以在需要 int类型结果的上下文中使用。
注释: 如果一个 lambda 表达式只在某些分支返回一个值, 而在另外一些分支不返回值, 这是不合法的。 例 如,(int x) -> { if (x >= 0) return 1; } 就不合法。
下面的程序显示了如何在一个比较器和一个动作监听器中使用 lambda 表达式。
package lambda;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
/**
* This program demonstrates the use of lambda expressions.
* ©version 1.0 2015-05-12
* ©author Cay Horstmann
*/
public class LambdaTest{
public static void main(String[] args){
String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune" };
System.out.println (Arrays.toString (planets)) ;
System.out.println("Sorted in dictionary order:");
Arrays.sort(pianets);
System.out.println (Arrays.toStri ng(pianets)) ;
System.out.println("Sorted by length:");
Arrays,sort(pianets, (first, second) -> first.lengthO - second.lengthO); System.out.println(Arrays.toString(pianets));
Timer t = new Timer(1000, event -> System,out.println("The time is " + new Date()));
t .start () ;
// keep program running until user selects "0k" JOptionPane.showMessageDialog(nul1, "Quit program?"); System.exit (O) ;
}
}