java-函数式编程-函数对象

定义

  • 什么是合格的函数?
  • 无论多少次执行函数,只要输入一样,输出就不会改变

对象方法的简写

其实在类中,我们很多参数中都有一个this,被隐藏传入了

函数也可以作为对象传递,lambda就是很好的例子

函数式接口中经常这么使用,定义方法名,具体的方法实现等待外界传入

示例

客户端有操作的函数

服务器端有数据

java 复制代码
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);
    }
}

服务器端

java 复制代码
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-行为参数化

操作的对象一直,但是操作的方式千千万,

  • 我们可以将共同的部分提取为一个方法
  • 将不同的操作的行为,将行为作为参数传递给这个方法
  • 上述的操作的方式就是行为参数化

过滤接口-定义过滤行为

java 复制代码
/**
 * 学生过滤接口
 */
interface StudentFilter {
    boolean test(Student student);
}

过滤器

java 复制代码
/**
 * 过滤学生
 * @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传递不同行为即可(当然也可以使用匿名内部类,不太简洁而已)
java 复制代码
// 随机定义个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-延迟执行

函数对象的使用在框架中是十分常见的,例如我们常用日志框架

  • 根据不同的日志级别执行不同的日志输出

函数对象

使用函数对象,存储日志

相关推荐
楚国的小隐士8 分钟前
在AI时代,如何从0接手一个项目?
java·ai·大模型·编程·ai编程·自闭症·自闭症谱系障碍·神经多样性
脏脏a15 分钟前
【C++模版】泛型编程:代码复用的终极利器
开发语言·c++·c++模版
island131415 分钟前
【C++仿Muduo库#3】Server 服务器模块实现上
服务器·开发语言·c++
散峰而望16 分钟前
【算法竞赛】C/C++ 的输入输出你真的玩会了吗?
c语言·开发语言·数据结构·c++·算法·github
小龙报16 分钟前
【C语言】内存里的 “数字变形记”:整数三码、大小端与浮点数存储真相
c语言·开发语言·c++·创业创新·学习方法·visual studio
yaki_ya16 分钟前
yaki-C语言:从概念基础到内存解析---数组(array)完全指南
java·c语言·算法
深耕AI17 分钟前
【VS Code避坑指南】点击Python图标提示“没有Python环境”,选择安装uv后这堆输出到底是什么意思?
开发语言·python·uv
刃神太酷啦17 分钟前
扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)
java·c语言·javascript·数据结构·c++·算法·leetcode
亚历克斯神18 分钟前
Java 25 模式匹配增强:让代码更简洁优雅
java·spring·微服务
星辰徐哥20 分钟前
Rust异步测试与调试的实践指南
android·java·rust