初步认识
Java 8引进了lambda表达式,这种表达式本质上是一个匿名方法。
在Java 8以前的代码中,为了实现带一个方法的接口,往往需要定义一个匿名类并重写接口方法,代码很臃肿。比如常见的Comparator接口:
String[] oldWay = "Improving code with Lambda expressions in Java 8".split(" ");
Arrays.sort(oldWay, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
// 忽略大小写排序:
return s1.toLowerCase().compareTo(s2.toLowerCase());
}
});
System.out.println(String.join(", ", oldWay));
有了 lambda之后呢,就大大不同了,我们完全可以这样:
Arrays.sort(newWay, (s1, s2) -> {
return s1.toLowerCase().compareTo(s2.toLowerCase());
});
在Java 8中,对于只有一个方法的接口,可以把它视为一个函数进行简化。
Java 8没有引入新的关键字lambda,而是用()->{}
这个奇怪的符号表示lambda函数。函数类型不需要申明,可以由接口的方法签名自动推导出来,对于上面的lambda函数:
return s1.toLowerCase().compareTo(s2.toLowerCase());
});
具体应用示例
示例1:
// Java 8之前:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Before Java8, too much code for too little to do");
}
}).start();
//Java 8方式:
new Thread(() -> System.out.println("In Java8, Lambda expression rocks !!")).start();
示例2
// Java 8之前:
List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
double total = 0;
for (Integer cost : costBeforeTax) {
double price = cost + .12 * cost;
total = total + price;
}
System.out.println("Total : " + total);
// Java 8方式:
double bill = costBeforeTax.stream().map((c) -> c + .12 * c).reduce((sum, c) -> sum + c).get();
System.out.println("Total : " + bill);