一、前言
1.1 什么叫做函数式编程,函数式编程有什么特点
1,接口中只有一个方法的时候才可使用lambda表达式;
函数式接口只有一个抽象方法,函数式接口可以包含多个default方法,可以包含多个static方法。
2,lambda表达式可以根据接口的参数和返回值的定义自动推断返回值和入参的类型,所以参数类型可以省略
二、函数编程示例一
编写一个接口,方法为可以通过传入对象返回对象id(定义取id的规则)
- 实体类:Student
public class Student {
private Integer id;
private String shortId;
private String name;
public Student(){
}
public Student(Integer id, String shortId, String name) {
this.id = id;
this.shortId = shortId;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getShortId() {
return shortId;
}
public void setShortId(String shortId) {
this.shortId = shortId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 函数式接口: GetId
public interface GetId<T> {
String getId(T t);
}
- 测试类: GetId
public class Test {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
for (int i = 0; i < 3; i++) {
Student t = new Student();
t.setId(i);
t.setShortId("shortId: " + i);
t.setName("test" + i);
students.add(t);
}
GetId<Student> mapper = t -> t.getShortId();
List res = filterList(mapper, students);
res.stream().forEach(System.out::println);
}
public static List filterList(GetId mapper, List<Student> students) {
return students.stream().map(t -> mapper.getId(t)).collect(Collectors.toList());
}
}
输出:
shortId: 0
shortId: 1
shortId: 2
三、函数式接口@FunctionalInterface
该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错
网友评论