1.什么时lambda表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。
2.语法
我们在使用Arrays.sort 方法时,可以通过传入一个比较器来为数组进行排序 Comparator接口。
public class LengthComparator implements Comparator<String> {@Overridepublic int compare(String s1, String s2) {return s1.length() - s2.length();}}
String[] str = {"Peter", "Jam", "Mary"};LengthComparator comp = new LengthComparator();Arrays.sort(str, comp);
在上面的例子中,我们传入代码来比较两个字符串的长度。这里需要计算 ;s1.length() - s2.length()
使用lambda表达式,我们可以传入一个函数(代码块)来作为比较器,而不同通过创建一个比较器对象来作为比较器。
语法:参数 -> 一个表达式,
由于 Java 是一种强类型语言,所以还需要指定参数的类型数据类型 参数 -> 一个表达式
2.1 第一个lambda表达式
(String s1, String s2) -> s1.length() - s2.length
这就是你看到的第一个lambda表达式。lambda表达式就是一个代码块,以及必须传入代码的变量规范。我们可以将这个lambda表达式作为参数放入 Arrays.sort 方法中
String[] str = {"Peter", "Jam", "Mary"};Arrays.sort(str, (String s1, String s2) -> s1.length() - s2.length());
2.2 多行代码
如果代码要完成的计算无法放在一个表达式中,就可以像写方法一样,将代码放在 {} 中,并且包含显式的return语句。
(String s1, String s2) -> {if(s1.length() > s2.length()) return 1;if(s1.length() < s2.length()) return -1;return 0;}
2.3 无参的lambda表达式
即使lambda表达式没有参数,任然要提供空括号,就像无参方法一样;() -> {System.out.print("Hello World")}
2.4 忽略参数类型
如果可以推导出表达式的参数类型,就可以忽略其类型
Comparator<String> comp= (s1, s2) -> s1.length() - s2.length()
无需指定 lambda 表达式的返回类型,lambda表达式的放回类型总是会有上下文推到得出。
如果一个 lambda 表达式只在某个分支返回一个值,而在另一个分支不反回值,这是不合法的。如:
(int x) -> {if(x >= 0) return 1;}
(int x) -> {if(x >= 0) return 1;return 0;}
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)
