函数式接口当参数使用

如果函数式接口作为一个方法的参数,就以为着要方法调用方自己实现业务逻辑,常见的使用场景是一个业务整体逻辑是不相上下的,但是在某一个步骤有不同的逻辑,例如数据处理有不同的策略,如果有大量的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))));
    }
}
相关推荐
无声旅者1 小时前
深度解析 IDEA 集成 Continue 插件:提升开发效率的全流程指南
java·ide·ai·intellij-idea·ai编程·continue·openapi
Ryan-Joee2 小时前
Spring Boot三层架构设计模式
java·spring boot
Hygge-star2 小时前
【数据结构】二分查找5.12
java·数据结构·程序人生·算法·学习方法
dkmilk2 小时前
Tomcat发布websocket
java·websocket·tomcat
工一木子2 小时前
【Java项目脚手架系列】第七篇:Spring Boot + Redis项目脚手架
java·spring boot·redis
哞哞不熬夜3 小时前
JavaEE--初识网络
java·网络·java-ee
等等5433 小时前
Java EE初阶——wait 和 notify
java·开发语言
API小爬虫3 小时前
淘宝按图搜索商品(拍立淘)Java 爬虫实战指南
java·爬虫·图搜索算法
lyrhhhhhhhh3 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
亚林瓜子4 小时前
AWS Elastic Beanstalk控制台部署Spring极简工程
java·spring·云计算·aws·eb