1.lambda是个匿名函数,可以说成抽象函数的实例,使java的语言能力得到提升
1.1格式 (x,y)-> {} 左边称为形参列表(抽象方法的形参列表),右边称为方法体(重写之后的方法体)
1.2 只要一个抽象方法的接口可以称之为函数式接口
2.要使用lambda表达式要实现函数示接口(FunctionInterface),主要是自带的四大函数式接口
3.示例,基本的使用
@Test
public void test7(){
Comparator<Integer> con1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
int com = con1.compare(12, 21);
System.out.println(com);
}
返回结构为-1 ,前面的值比后面小
如果使用lambda表达式,可以改写成
Comparator<Integer> comparator = ((o1, o2) ->
Integer.compare(o1,o2)
);
int i = comparator.compare(20, 30);
System.out.println(i);
如果使用方法引用,代码变得更简洁
Comparator<Integer> comparator1 = Integer::compare;
4.通过上述的简单示例可以基本看出lambda基本格式,下面简单看下lambda表达式的常见6个类型
4.1 无参无返回值
Runnable runnable = ()-> {
System.out.println("hhhhh");
};
runnable.run();
4.2 需要一个参数,没有返回值
@Test
public void test8(){
Consumer<String> consumer = (String s)->{
System.out.println(s);
};
consumer.accept("xxxxxxxxx");
}
4.3数据类型可以省略,可以由编译器推断,和上面的例子相比,少了形参的类型String
public void test8(){
Consumer<String> consumer = (s)->{
System.out.println(s);
};
consumer.accept("xxxxxxxxx");
}
4.4 若只需要一个参数,小括号可以省略,这里不做示例,参照4.3
4.5 .需要两个以上的参数,并且有多条执行语句,可以有返回值,不做示例,参照3
4.6 lambda体中只有一条执行语句,return和{}都可以省略,不做示例
5.在java.util.function包下定义了丰富的函数式接口
5.1 四大函数式接口
Consumer 返回类型 void
Supplier、 返回值类型 无
Function<T.R> 返回值类型R
Predicate 返回值类型Boolean
6.方法的引用
6.1 要传递给lambda体的操作,已经有实现的方法,可以使用方法引用,主要是类和对象的引用,将在下篇文介绍