JDK8接口
说到接口,我们先谈谈JDK8之前的接口
在JDK8之前的版本中,接口里的方法都是抽象的,并且不能存在静态方法
所有方法的申名都用 public [返回类型] [方法名] (参数列表) [抛出异常];
按照之前来说,接口里全都是抽象方法,也就是极端抽象类。
- 接口中的方法全是抽象方法
- 接口中的成员变量全是常量
- 接口中的所有成员权限都是 public
- 修饰符 interface,不是 class
在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的。
JDK8及以后,允许我们在接口中定义static方法和default方法。
public interface JDK8Interface {
// static修饰符定义静态方法
static void staticMethod() {
System.out.println("接口中的静态方法");
}
// default修饰符定义默认方法
default void defaultMethod() {
System.out.println("接口中的默认方法");
}
}
再定义一个接口的实现类:
public class JDK8InterfaceImpl implements JDK8Interface {
//实现接口后,因为默认方法不是抽象方法,所以可以不重写
//但是如果开发需要,也可以重写
}
静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。default方法,只能通过接口实现类的对象来调用。
public class Main {
public static void main(String[] args) {
// static方法必须通过接口类调用
JDK8Interface.staticMethod();
//default方法必须通过实现类的对象调用
new JDK8InterfaceImpl().defaultMethod();
}
}
所以,在JDK8的接口中可以写以下内容
- 常量
- 抽象方法
- 默认方法
- 静态方法
lambda表达式
1、Lamdba
Lambda 允许把函数作为一个方法的参数,使用Lamdba可以让开发的代码更加简洁,但是易读性差,新人不了解Lamdba表达式或者代码功底有点差,不容易读懂大佬们写的代码了。
2、Lamdba语法格式
(参数) -> 表达式
或
(参数) ->{ 多个表达式; }
参数可以是多个,也可以是1个,也可以没有参数,expression 同样是多个,或者是1个,或者无表达式
下面是一个简单的例子
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
再详细点:
我们先定义一个展示接口
@FunctionalInterface
public interface Foo {
/**
* 传入一个label标签,传入一个对应的值,显示一组结果
* @param label
* @param value
*/
void show(String label,String value);
}
然后弄一个执行类
public static void main(String[] args) {
//-------匿名内部类
Foo f1 = new Foo() {
@Override
public void show(String label, String value) {
System.out.println("<<"+label+"="+value+">>");
}
};
}
f1.show("姓名", "张三");
结果为
<<姓名=张三>>
但用了lambda表达式后过程可以简化为:
public static void main(String[] args) {
Foo f2 = (label,value) -> System.out.println("<<"+label+"="+value+">>");
f2.show("年龄", "20");
}
结果:
<<年龄=20>>