一、Lambda表达式 (参数类型 参数名) -> {方法体}
Lambda表达式必须用于接口,且接口中公开的方法只有一个。
Lambda表达式只在意参数和方法体,不在意类名和方法名。
Lambda表达式中如果参数可以把参数类型省略,如果参数只有一个 那么参数的括号也可以省略。
省略前写法:(参数类型 参数名) -> {方法体}
省略后写法:一个参数: 参数名 -> {方法体} 《=====》 多个参数则是:(参数名,参数名,参数名)-> {方法体}
Lambda表达式中方法体如果只有一行代码,那么方法体括号也可以省略。
参数名 -> System.out.print("哈哈哈") 这句代码和下面一样
参数名 -> {System.out.print("哈哈哈")}
Lambda表达式中方法体是需要返回值的,括号,return关键字,分号都可以省略
省略前:参数名 -> { return a==1; }
省略后:参数名 -> a==1
二、函数式接口
函数式接口(functional interface 也叫功能性接口,其实是同一个东西)。简单来说,函数式接口是只包含一个方法的接口。比如Java标准库中的java.lang.Runnable和 java.util.Comparator都是典型的函数式接口。 java 8提供 @FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准(即只包含一个方法的接口),虚拟机会自动判断, 但 最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。
Java中的lambda无法单独出现,它需要一个函数式接口来盛放,lambda表达式方法体其实就是函数接口的实现.
例如:
@FunctionalInterface // 此注解就是标记此接口为函数式接口, 只能包含一个方法的接口,静态和默认方法除外!
public interface Car{
void show();
}