函数式接口详解(Java)_函数式接口作为参数_凯凯凯凯.的博客-CSDN博客
函数式接口:有且仅有一个抽象方法的接口
Java中函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口
只有确保接口中仅有一个抽象方法,Java中的Lambda才能顺利地进行推导
如何检测一个接口是不是函数式接口呢?
@Functionallnterface
放在 接口定义的上方:如果接口是函数式接口,编译通过;如果不是,编译失败
注意:
我们自己定义函数式接口的时候,@Functionallnterface是可以选的,就算我们不写这个注解,只要保证满足函数式接口定义的条件,也照样是函数式接口。但是,建议加上该注解
1.2 函数式接口作为方法的参数
1.3 函数式接口作为方法的返回值
2.1 常用的函数式接口
Java 8在java.util.function包下预定义了大量的函数式接口供我们使用
我们重点学习下面4个接口
- Supplier接口
- Consumer接口
- Predicate接口
- Function接口
示例: list根据属性去重
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
@Test
public void distinctByProperty2() throws JsonProcessingException {
List<Student> studentList = getStudentList();
//根据名字去重
studentList = studentList.stream()
.filter(distinctByKey(Student::getName))
.collect(Collectors.toList());
studentList = studentList.stream()
.filter(distinctByKey(temp->temp.getName()))
.collect(Collectors.toList());
}