定义
- 什么是合格的函数?
- 无论多少次执行函数,只要输入一样,输出就不会改变
对象方法的简写
其实在类中,我们很多参数中都有一个this,被隐藏传入了
函数也可以作为对象传递,lambda就是很好的例子
函数式接口中经常这么使用,定义方法名,具体的方法实现等待外界传入
示例
客户端有操作的函数
服务器端有数据
public class Client {
// 操作在客户端
interface MyLambda extends Serializable {
int fun(int a, int b);
}
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",8888);
MyLambda lambda = (a, b) -> a + b;
OutputStream outputStream = socket.getOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(lambda);
}
}
服务器端
public class Server {
// 数据在服务器端
public static void main(String[] args) throws IOException, ClassNotFoundException {
ServerSocket serverSocket = new ServerSocket(8888);
while(true){
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Client.MyLambda myLambda = (Client.MyLambda) objectInputStream.readObject();
System.out.println(myLambda.fun(1,2));
}
}
}
函数对象优点1-行为参数化
操作的对象一直,但是操作的方式千千万,
- 我们可以将
共同的部分提取为一个方法
- 将不同的操作的行为,将行为
作为参数传递给这个方法
- 上述的操作的方式就是
行为参数化
过滤接口-定义过滤行为
/**
* 学生过滤接口
*/
interface StudentFilter {
boolean test(Student student);
}
过滤器
/**
* 过滤学生
* @param students 学生列表
* @param filter 过滤条件
* @return 过滤后的学生列表
*/
public static List<Student> filterStudent(List<Student> students, StudentFilter filter) {
List<Student> list = new ArrayList<>();
for (Student student : students) {
if (filter.test(student)) {
list.add(student);
}
}
return list;
}
使用的时候传递行为即可
- 统一调用 filterStudent 方法
- 使用
lambda传递不同行为
即可(当然也可以使用匿名内部类,不太简洁而已)
// 随机定义个Student列表
List<Student> students = List.of(
new Student("张三", 18, "男"),
new Student("李四", 19, "女"),
new Student("王五", 20, "男"),
new Student("赵六", 21, "女")
);
System.out.println("学生列表:");
students.forEach(System.out::println);
// 过滤出年龄大于18的学生
List<Student> ageFilter = filterStudent(students, student -> student.getAge() > 18);
System.out.println("年龄大于18的学生:");
ageFilter.forEach(System.out::println);
// 过滤出性别为男的学生
List<Student> genderFilter = filterStudent(students, student -> "男".equals(student.getGender()));
System.out.println("性别为男的学生:");
genderFilter.forEach(System.out::println);
函数对象优点2-延迟执行
函数对象的使用在框架中是十分常见的,例如我们常用日志框架
- 根据不同的日志级别执行不同的日志输出