一、接口的默认方法
允许给接口添加 一个 非抽象 的 方法实现,使用default关键字:
interface Test1 {
//接口里定义的抽象方法
public abstract void method1();
//接口的默认方法
default String method2() {
return "method2()";
}
}
实现了Test1接口的子类只需要实现method1()方法即可,默认方法method2()可以直接使用:
//接口不能直接实现,使用匿名内部类
Test1 test1 = new Test1(){
@Override
public void method1() {
System.out.println("method1()");
}
};
//调用接口的抽象方法
test1.method1(); //method1();
//调用接口的默认方法
test1.method2(); //method2();
除了默认方法,Java8的 接口 也可以有 静态方法 的实现:
public interface MyInterf {
String m1();
default String m2() {
return "Hello default method!";
}
static String m3() {
return "Hello static method in Interface!";
}
}
二、Lambda表达式
语法:(参数列表) 箭头符合(->) {方法体}。
(参数1,参数2…参数n) -> {方法体}。
如果方法体只有一行代码,可以省略大括号{}和return关键字。
(参数列表) -> 表达式
例:
//1.不需要参数,返回值为5
() -> 5;
//2.接收一个参数,返回其2倍的值
(x) -> 2*x;
//3.接收两个参数,返回和
(x,y) -> x + y;
//4.接收一个字符串对象,并在控制台打印输出
(String s) -> System.out.println(s);
//5.Java8可以自动推导参数类型,可以不用写参数类型
(s) -> System.out.println(s); //Java编译器会根据你传入的值自动推导出类型
注:Lambda表达式只能用来 简化 仅包含 一个 public方法的 接口 的创建
例:
public interface In {
void func();
}
//lambda表达式
a. In in1 = ()->{};
b. In in2 = ()->System.out.println("Lambda表达式");
c. In in3 = ()->{
System.out.println("Lambda表达式1");
System.out.println("lambda表达式2");
}
----------------------------------------------------
public interface In {
void func(int a);
}
//lambda表达式
a. In in = a->System.out.println(a);
b. In in = (a)->{};
----------------------------------------------------
public interface In {
int func(int a);
}
//lambda表达式
a. In in = a->a+1;
b. In in2 = a -> {
return a+1;
};
----------------------------------------------------
new Thread(new Runnable() {
@Override
public void run() {
//do something
}
}).start();
//lambda表达式
new Thread(()->{
//do something
}).start();
Java的λ表达式只能用作赋值、传参、返回值等。