1 概述
- 如果一个
接口
中,只声明了一个抽象方法
,则此接口就称为函数式接口。
@FunctionalInterface
public interface MyInterface {
void method1();
}
- 可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个
受检异常
(即:非运行时异常),那么该异常需要在目标接口的抽象方法
上进行声明)。 - 可以在一个接口上使用
@Functionallnterface
注解,这样做可以检查它是否是一个函数式接口。同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。 - 在
java.util.function
包下定义了Java8的丰富的函数式接口 - lambda表达式就是一个函数式接口的
实例
,是一个对象。 - 以前使用
匿名实现类
表示的,现在都可以用lambda表达式来写。
2 Java内置的函数式接口
3 示例
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
public class LambdaTest2 {
@Test
public void test1() {
happyTime(500, new Consumer<Double>() {
@Override
public void accept(Double aDouble) {
System.out.println("买了一个瓜,花费了 " + aDouble);
}
});
System.out.println("**********使用lambda表达式重写**********");
happyTime(400, money -> System.out.println("萨日朗,赔了 " + money));
}
public void happyTime(double money, Consumer<Double> con) {
con.accept(money);
}
@Test
public void test2() {
List<String> list = Arrays.asList("北京", "天津", "南京", "东京");
System.out.println(filterString(list, new Predicate<String>() {
@Override
public boolean test(String s) {
return s.contains("京");
}
}));
System.out.println("**********使用lambda表达式重写**********");
System.out.println(filterString(list, s -> s.contains("京"))) ;
}
public List<String> filterString(List<String> list, Predicate<String> pre) {
List<String> res = new ArrayList<>();
for (String s : list) {
if (pre.test(s)) {
res.add(s);
}
}
return res;
}
}
参考资料
1.尚硅谷Java零基础入门教程(含百道Java真题,2万多行Java代码实战)