函数式接口当参数使用

如果函数式接口作为一个方法的参数,就以为着要方法调用方自己实现业务逻辑,常见的使用场景是一个业务整体逻辑是不相上下的,但是在某一个步骤有不同的逻辑,例如数据处理有不同的策略,如果有大量的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))));
    }
}
相关推荐
ai大佬几秒前
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
java·spring·自动化·api中转·apikey
Mr__Miss25 分钟前
面试踩过的坑
java·开发语言
爱喝一杯白开水26 分钟前
POI从入门到上手(一)-轻松完成Apache POI使用,完成Excel导入导出.
java·poi
向哆哆1 小时前
Java 安全:如何防止 DDoS 攻击?
java·安全·ddos
啥都想学的又啥都不会的研究生1 小时前
Kubernetes in action-初相识
java·docker·微服务·容器·kubernetes·etcd·kubelet
毅航1 小时前
MyBatis 事务管理:一文掌握Mybatis事务管理核心逻辑
java·后端·mybatis
宝耶2 小时前
面试常问问题:Java基础篇
java·面试·职场和发展
躲在云朵里`2 小时前
IDEA搭建环境的五种方式
java·ide·intellij-idea
喵手2 小时前
从 Java 到 Kotlin:在现有项目中迁移的最佳实践!
java·python·kotlin
阑梦清川2 小时前
AI超级智能体项目教程(二)---后端项目初始化(设计knif4j接口文档的使用)
java·前端·数据库