1.引入Lambda表达式的背景
Lambda使得在多线程中分布处理集合更容易,在Java8中,目的是,不是要提供给集合这样一些方法,他们有一定的功能且每一个以不同的方式来处理他们的元素,集合现在可以组织自己的内部迭代,将并行化的责任从客户端转成内部库实现。而且在传递过程中可以将方法作为参数传递,对于一个复杂的处理流程,每一个步骤产生的结果都会马上传递给下一个步骤,如果能得到满足条件的参数,马上会终止计算。
简单说,Lambda表达式就是一个不用被绑定在标识符上,并且可能被调用的函数。
2.Lambda语法详解
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
statment1;
statment2;
//.............
return statmentM;
}
Lambda表达式三个重要的组成部分是:输入参数,可执行语句,存放外部变量的空间。
List<String> names = new ArrayList<>();
names.add("MeiTuan");
names.add("DianPing");
List<String> lowercaseNames = names.stream().map((String name) -> {return name.toLowerCase();}).collect(Collectors.toList());
Lambda的实现是依附于函数式接口的,对于这种接口,只声明了一个方法,所以参数的类型和顺序都是固定的,上面的公式进而可以演化成
List<String> names = new ArrayList<>();
names.add("MeiTuan");
names.add("DianPing");
List<String> lowercaseNames = names.stream().map(name -> name.toLowerCase()).collect(Collectors.toList());
我们在集合中写的比较集合内元素的大小。
String[] oldWay = "help with lambda".split(" ");
Arrays.sort(oldWay, new Comparator<String>() {
public int compare(String s1, String s2) {
// 忽略大小写排序:
return s1.toLowerCase().compareTo(s2.toLowerCase());
}
});
System.out.println(String.join(", ", oldWay));
可以直接简单写为
String[] newWay = "help with lambda".split(" ");
Arrays.sort(newWay, (s1, s2) -> {
return s1.toLowerCase().compareTo(s2.toLowerCase());
});
System.out.println(String.join(", ", newWay));
3.函数式接口
函数式接口是只包含一个抽象方法声明的接口。每个Lambda表达式都能隐式的赋值给函数式接口,例如:
Consumer<Integer> c = (int x) -> { System.out.println(x) };
BiConsumer<Integer, String> b = (Integer x, String y) -> System.out.println(x + " : " + y);
Predicate<String> p = (String s) -> { s == null };
@FunctionalInterface是Java8的新接口,用于指明该接口类型声明是根据Java语言规范定义的函数式接口。函数式接口只能有一个抽象方法,如果尝试添加第二个抽象方法,将抛出编译时错误。
//Old way:
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7);
int sum = 0;
for(Integer n : list) {
int x = n * n;
sum = sum + x;
}
System.out.println(sum);
//New way:
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7);
int sum = list.stream().map(x -> x*x).reduce((x,y) -> x + y).get();
System.out.println(sum);
4.Lambda表达式和匿名类的区别
对于关键词方面,对于匿名类,关键词this解读为匿名类,而对于Lambda表达式,关键词this解读为Lambda的外部类。