1、接口中的成员
1、成员变量:默认是由public static final修饰
2、抽象方法:默认是有public abstract修饰,并且没有方法体
3、默认方法:由default修饰,实现类对象.方法名();并且可以不需要进行复写,直接调用
4、静态方法:由static修饰,调用:接口名.方法名(实参);,同时注意,静态方法不能被子接口继承同时也不能被实现类重写以及直接调用
2、函数式接口
定义:接口中有且只有一个抽象方法,但是可以有多个非抽象方法,通过@FunctionalInterface进行标记
@FunctionalInterface
public interface FunctionalInterfacePra {
//抽象方法
void get();
//静态方法
public static void test1(){
}
//默认方法
public default void test2(){
}
}
3、lambda表达式
前提:使用lambda时,接口必须是函数式接口
//语法
函数式接口 变量名 = (参数1,参数2...) -> {
//方法体
}
好处:1、使代码更加整洁
2、会将重点放在方法体上
3、不会产生新的字节码文件
lambda表达式简写的要求:
1、=右边的类型会根据左边的函数式接口类型自动推断;
2、如果形参列表为空,只需保留();
3、如果形参只有1个,()可以省略,只需要参数的名称即可;
4、如果执行语句只有1句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
5、形参列表的数据类型会自动推断;
6、lambda不会生成一个单独的内部类文件;
7、lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,此后在修改该局部变量,会报错;
在lambda中引用构造方法:
//语法
类名::new;//会根据抽象方法的形参顺序,自动在给定的类中寻找构造方法进行匹配
相当于:() -> {
}
在lambda中引用静态方法:
//语法
类名::静态方法名;
相当于:() -> {
}
public class LambdaTest {
@Test
public void testName() throws Exception {
List<Object> arrayList = new ArrayList<>();
arrayList.add("张三");
arrayList.add("张三2");
arrayList.add("张三3");
arrayList.forEach(System.out::println);
}
}