函数式接口当参数使用

如果函数式接口作为一个方法的参数,就以为着要方法调用方自己实现业务逻辑,常见的使用场景是一个业务整体逻辑是不相上下的,但是在某一个步骤有不同的逻辑,例如数据处理有不同的策略,如果有大量的if-els,或者switch-case还可以结合工厂模式消除这些分支代码。上代码

java 复制代码
package com.dj.lambda;

import java.util.List;
import java.util.function.Function;

/**
 * User: ldj
 * Date: 2024/1/28
 * Time: 14:57
 * Description: 业务模板
 */
public class LambdaTemplate {

    public Object execute(List<Integer> data, Function<List<Integer>, Object> function) {
        connect();
        request();
        return invokeHandler(data, function);
    }

    //步骤一
    private void connect() {
        System.out.println("连接成功");
    }

    //步骤二
    private void request() {
        System.out.println("获取数据成功");
    }

    //步骤三  只有这里不同,处理数据有不同的处理策略 (假设apply方法有很多复杂的业务逻辑)
    private Object invokeHandler(List<Integer> data, Function<List<Integer>, Object> function) {
        return function.apply(data);
    }
}

数据处理不同的策略:

java 复制代码
package com.dj.lambda;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * User: ldj
 * Date: 2024/1/28
 * Time: 15:26
 * Description: list元素去重
 */
public class DistinctHandler implements Function<List<Integer>, Object> {

    @Override
    public Object apply(List<Integer> integers) {

        return integers.stream().distinct().collect(Collectors.toList());
    }
}



package com.dj.lambda;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * User: ldj
 * Date: 2024/1/28
 * Time: 15:21
 * Description: 统计list相同元素出现的次数
 */
public class StatisticsHandler implements Function<List<Integer>, Object> {

    @Override
    public Object apply(List<Integer> integers) {

        return integers.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    }
}
java 复制代码
package com.dj.lambda;

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.stream.Collectors;

/**
 * User: ldj
 * Date: 2024/1/28
 * Time: 15:42
 * Description: No Description
 */
public class Test {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 1, 1, 4, 2, 5, 3, 6);
        LambdaTemplate lambdaTemplate = new LambdaTemplate();

        //1.像这种业务比较复杂,代码比较多的建议写实现类,比如策略类
        System.out.println(lambdaTemplate.execute(list, new StatisticsHandler()));
        System.out.println(lambdaTemplate.execute(list, new DistinctHandler()));

        //2.如果是简单的,直接使用lambda表达式书写更为合适
        System.out.println(lambdaTemplate.execute(list, els-> els.stream().sorted().collect(Collectors.toList())));
        System.out.println(lambdaTemplate.execute(list, els -> els.stream().sorted().collect(Collectors.toCollection(LinkedHashSet::new))));
    }
}
相关推荐
itzixiao11 分钟前
L1-067 洛希极限(10分)[java][python]
java·开发语言·算法
java1234_小锋18 分钟前
Spring AI 2.0 开发Java Agent智能体 - Spring AI项目调用本地Ollama模型
java·人工智能·spring·spring ai2.0
二哈赛车手19 分钟前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
PESS ABIN20 分钟前
JavaWeb项目打包、部署至Tomcat并启动的全程指南(图文详解)
java·tomcat
AI进化营-智能译站26 分钟前
ROS2 C++开发系列15-模板实现通用算法|宏定义ROS2调试开关|一次编码适配多平台
java·c++·算法·ai
刀法如飞28 分钟前
Java数组去重的20种实现方式——指导AI解决不同问题的思路
java·算法·面试
薪火铺子38 分钟前
SpringMVC请求处理流程源码解析(第1篇):请求入口与处理器映射
java·后端·spring
ch.ju38 分钟前
Java程序设计(第3版)第二章——参数(实参 形参)
java
椰猫子39 分钟前
SpringMVC(SpringMVC简介、请求与响应(请求映射路径、请求参数、日期类型参数传递、响应json数据))
java·前端·数据库
海兰42 分钟前
【开篇】Spring AI、OpenClaw 和Hermes
java·人工智能·spring·spring ai