1.什么时lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。

2.语法

我们在使用Arrays.sort 方法时,可以通过传入一个比较器来为数组进行排序 Comparator接口

  1. public class LengthComparator implements Comparator<String> {
  2. @Override
  3. public int compare(String s1, String s2) {
  4. return s1.length() - s2.length();
  5. }
  6. }
  1. String[] str = {"Peter", "Jam", "Mary"};
  2. LengthComparator comp = new LengthComparator();
  3. Arrays.sort(str, comp);

在上面的例子中,我们传入代码来比较两个字符串的长度。这里需要计算 ;
s1.length() - s2.length()
使用lambda表达式,我们可以传入一个函数(代码块)来作为比较器,而不同通过创建一个比较器对象来作为比较器。
语法:
参数 -> 一个表达式
由于 Java 是一种强类型语言,所以还需要指定参数的类型
数据类型 参数 -> 一个表达式

2.1 第一个lambda表达式

  1. (String s1, String s2) -> s1.length() - s2.length
  1. 这就是你看到的第一个lambda表达式。lambda表达式就是一个代码块,以及必须传入代码的变量规范。我们可以将这个lambda表达式作为参数放入 Arrays.sort 方法中
  1. String[] str = {"Peter", "Jam", "Mary"};
  2. Arrays.sort(str, (String s1, String s2) -> s1.length() - s2.length());

2.2 多行代码

  1. 如果代码要完成的计算无法放在一个表达式中,就可以像写方法一样,将代码放在 {} 中,并且包含显式的return语句。
  1. (String s1, String s2) -> {
  2. if(s1.length() > s2.length()) return 1;
  3. if(s1.length() < s2.length()) return -1;
  4. return 0;
  5. }

2.3 无参的lambda表达式

即使lambda表达式没有参数,任然要提供空括号,就像无参方法一样;
() -> {System.out.print("Hello World")}

2.4 忽略参数类型

如果可以推导出表达式的参数类型,就可以忽略其类型

  1. Comparator<String> comp
  2. = (s1, s2) -> s1.length() - s2.length()

无需指定 lambda 表达式的返回类型,lambda表达式的放回类型总是会有上下文推到得出。

如果一个 lambda 表达式只在某个分支返回一个值,而在另一个分支不反回值,这是不合法的。如:

  1. (int x) -> {
  2. if(x >= 0) return 1;
  3. }
  1. (int x) -> {
  2. if(x >= 0) return 1;
  3. return 0;
  4. }

3.方法引用

有时侯,可能有现成的方法可以完成你想要传递到其它代码的某个动作。例如,你希望只要出现一个定时器对象就打印这个事件对象。当然,你可以调用
Timer t = new Timer(1000, event -> System.out.println(event));

但是,如果直接把 print 方法传递到 Timer 构造器就更好了。
Timer t = new Timer(1000, System.out::println);
表达式 System.out::println 是一个方法引用,等价于 x-> System.out.println(x)

假设你相对字符串进行排序而不考虑大小写,可以传递以下表达式
Array.sotr(strings, String::compareToLgnoreCase)