1.java8新特性 : 函数式接口
什么是函数式接口?
- 只包含一个抽象方法的接口称为函数式接口.该接口可以包含其他非抽象方法.
- 可以通过lambda表达式创建该接口的实现类的对象.(lambda表达式抛出受检异常,那么该异常需要在目标接口的抽象方法上进行声明)
- 我们可以在抽象方法上使用注解,这样做可以检查是否是函数式接口.
- 在java.util.function包下,定义了java8丰富的函数式接口.
2.冗余的匿名内部类与简洁的lambda表达式
例 :
public class LambdaTest {
public static void main(String[] args) {
//实现线程当中提及的Runnable接口,重写了当中的一个抽象方法, 并创建了匿名实现类的对象
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("hexua你太酷啦");
}
};
r1.run();
//如果我们使用lambda表达式,将会非常简洁
Runnable r2 = () -> {
System.out.println("hexua你太酷啦");
};
r2.run();
//运行会发现,两种写法运行结果相同
//hexua你太酷啦
//hexua你太酷啦
}
}
接着我们来介绍一下lambda表达式的语法.
3.lambda表达式的语法
lambda表达式 : 在java8中引入了一种新的语法元素和操作符.即"->".该操作符被称为箭头操作符.它将lambda表达式分为两个部分 :
(1)左侧:指定了lambda表达式需要的参数列表.
(2) 右侧: 指定了lambda体,是抽象方法的实现逻辑.也即lambda表达式要执行的功能.
接下来介绍六种语法格式.
4.语法格式
(1). 无参数, 无返回值类型
@Test
public void test1() {
//无参数, 无返回值类型
Runnable r1 = () -> {
System.out.println("语法格式-1");
};
r1.run();
//输出和 : 语法格式-1
}
(2). 需要一个参数, 但是没有返回值
@Test
public void test2() {
//需要一个参数, 但没有返回值
LambdaInterface<String> l1 = (String s) -> {
System.out.println(s + "tkl");
};
l1.show("hexua");
//输出 : hexuatkl
}
}
interface LambdaInterface<T> {
void show(T s);
}
(3). 数据类型可以省略, 因为可以由编译器推断得出, 称为类型推断
@Test
public void test3() {
//类型推断, String类型可以省略
LambdaInterface<String> l1 = (s) -> {
System.out.println(s + "tkl");
};
l1.show("hexua");
//输出 : hexuatkl
}
}
interface LambdaInterface<T> {
void show(T s);
}
(4). 参数列表只有一个参数的情况下, 小括号可以省略
@Test
public void test4() {
//参数列表只有一个参数的情况下, 圆括号也可以不写
LambdaInterface<String> l1 = s -> {
System.out.println(s + "tkl");
};
l1.show("hexua");
//输出 : hexuatkl
}
}
interface LambdaInterface<T> {
void show(T s);
}
(5). 需要两个或两个以上的参数时,多条执行语句, 并且可以有返回值
@Test
public void test5() {
LambdaInterface<String> l1 = (s, t) -> {
System.out.println("我也不知道这里写什么");
return s + "你过来啊" + t;
};
System.out.println(l1.show("hexua", "hexi"));
//输出 : 我也不知道这里写什么
//hexua你过来啊hexi
}
}
interface LambdaInterface<T> {
String show(T s, String t);
}
(6). 若只有一条语句, return和大括号都可以省略
@Test
public void test6() {
//只有一条语句时, return与大括号若有, 都可以省略
LambdaInterface l2 = () -> "return与大括号都可以省略";//返回值语句
System.out.println(l2.show());
//输出 : return与大括号都可以省略
}
}
interface LambdaInterface<T> {
String show();
}
5.(重点)四种常见的函数式接口
(1). 消费型接口 : 对类型为T的对象应用操作, 包含方法void accept(T t).
Consumer<T>
抽象方法 : void accept(T t)
(2). 供给型接口 : 返回类型为T的对象, 包含方法T get().
Supplier<T>
抽象方法 : T get()
(3). 函数型接口 : 对类型为T的对象应用操作, 并返回类型为R的对象. 包含方法R apply(T t)
Function<T, R>
抽象方法 : R apply(T t)
(4). 判断型接口 : 确定类型为T的对象是否满意某约束, 并返回boolean值, 包含方法boolean test(T t)
Predicate<T>
抽象方法 : boolean test(T t)