Java 8系列:
Java 8系列之Lambda表达示
Java 8系列之StreamApi
Java 8系列之Collector
Java 8系列之Optional
Java 8系列之Future
1.Lambda的基本语法
(parameters) -> expression 或(请注意语句的花括号)
(parameters) -> { statements; }
2.Lambda表达示的使用场景
在函数式接口上使用Lambda表达式
函数式接口就是只定义一个抽象方法的接口
Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(用匿名内部类也可以完成同样的事情,只不过比较笨拙:需要提供一个实现,然后再直接内联将它实例化)
Integer[] aa=new Integer[]{2,3,8,6,3};
@Test
public void test1(){
//使用匿名类
Collections.sort(Arrays.asList(aa), new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
});
System.out.println(Arrays.toString(aa));
}
@Test
public void test2(){
//使用Lambda
Collections.sort(Arrays.asList(aa), (o1, o2) ->Integer.compare(o1, o2));
System.out.println(Arrays.toString(aa));
}
3.函数描述符
函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。我们将这种抽象方法叫作函数描述符.
例如,Comparator接口可以看作一个接受两个参数并返回一个整数的函数签名,
因为它只有一个叫作compare的抽象方法,这个方法受两个参数并返回一个整数
Lambda表达式是怎么做类型检查:函数描述符,即抽象方法的签名要和Lambda表达式的签名一致
常见函数描述符的函数式接口:
Predicate
java.util.function.Predicate接口定义了一个名叫test的抽象方法,它接受泛型T对象,并返回一个boolean。
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
Consumer
java.util.function.Consumer定义了一个名叫accept的抽象方法,它接受泛型T
的对象,没有返回(void)。你如果需要访问类型T的对象,并对其执行某些操作,就可以使用这个接口。
Consumer<Integer> print=o-> System.out.println(o);
Function
java.util.function.Function<T, R>接口定义了一个叫作apply的方法,它接受一个
泛型T的对象,并返回一个泛型R的对象。
Function<String, Integer> trans=o->o.length();
4.类型检查
Lambda的类型是从使用Lambda的上下文推断出来的
首先,你要找出sort方法的声明,。
第二,Comparator(目标类型)对象是sort()方法的第二个正式参数。
第三,Comparator是一个函数式接口,定义了一个叫作compare的抽象方法。
第四,compare方法描述了一个函数描述符,它可以接受两个Integer,并返回一个Integer。
最后,sort第二个参数的任何实际参数都必须匹配这个
5.方法引用
Lambda的一种快捷写法
@Test
public void test3(){
Collections.sort(Arrays.asList(aa), Integer::compare);
System.out.println(Arrays.toString(aa));
}