JDK1.8新特性
接口的默认方法
- 接口里可以有实现的方法,方法default(需要写出来)关键字;
- 接口里可以有实现的静态方法,在方法前面加static关键字。
package com.hqyj;
public interface Interface8 {
//接口里面的方法如果添加default关键字,这个方法可以在接口里面实现
//一个接口里可以有多个default方法
//加了default关键字的方法必须要实现
default void showName(){
System.out.println("jdk1.8默认的接口方法");
}
//接口中加了static关键字的方法必须要实现
//一个接口可以有多个静态方法
static void methodStatic(){
System.out.println("jdk1.8的接口可以用静态实现的方法");
}
}
测试代码:
public class Interface8Impl implements Interface8 {
public static void main(String[] args) {
Interface8Impl interface8 = new Interface8Impl();
interface8.showName();
Interface8.methodStatic();
}
}
函数式接口
-
接口只有一个抽象方法,可以有其他的实现方法;
-
函数式接口一般在接口名称上添加注解@FunctionalInterface,添加注解后,会校验接口里面是否只有一个抽象方法;
-
函数式的接口跟注解@FunctionalInterface没有必然关系,只要符合第一条要求,不添加注解也是函数式接口。
作用:函数式接口在实现的时候可以用朗姆达lambda表达式(箭头函数)
package com.hqyj;
@FunctionalInterface //添加注解强制进行语法检查接口是否只有一个抽象方法
public interface MyFuncInterface {
//一个接口如果只有一个抽象方法,这个接口就是函数式接口
//只要满足只有一个接口方法,即便不添加注解@FunctionalInterface,也是函数式接口,注解的目的只是限制的作用
int sum(int a, int b);
default void fun1(){
}
static void fun2(){
}
}
朗姆达表达式 lambda
是方法简化的写法,例如:
int sum(int a, int b){
return a + b;
}
lambda表达式:
(a, b) -> {a + b}
Lambda表达式:
//方法体只有一行代码,不用大括号,也不要分号,参数不需要写类型
//()-> 5 //无参方法,返回5,方法体只有一行代码,这行代码结果自动作为返回值没有参数要写小括号。
// x -> 2 * x //一个参数x,返回2*x,一个参数可以不写小括号
// (x, y) -> x - y //两个参数x和y,返回结果是x-y
// () -> {多行代码} //方法体有多行代码需要大括号
Lambda表达式与函数式接口配合使用
- 接口函数式定义
@FunctionalInterface
public interface MathOpreation {
int opt(int a, int b);
}
- 用Lambda表达式实现接口并创建对象,调用接口方法
package com.hqyj;
public class MathOpreationTest {
public static void main(String[] args) {
//加法
MathOpreation add = (a, b) -> (a + b);
//减法
MathOpreation sub = (a, b) -> (a - b);
//乘法
MathOpreation