函数式接口当参数使用

如果函数式接口作为一个方法的参数,就以为着要方法调用方自己实现业务逻辑,常见的使用场景是一个业务整体逻辑是不相上下的,但是在某一个步骤有不同的逻辑,例如数据处理有不同的策略,如果有大量的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))));
    }
}
相关推荐
间彧17 小时前
SimpleDateFormat既然不推荐使用,为什么java 8+中不删除此类
java
间彧17 小时前
DateTimeFormatter相比SimpleDateFormat在性能上有何差异?
java
间彧18 小时前
为什么说SimpleDateFormat是经典的线程不安全类
java
MacroZheng18 小时前
横空出世!MyBatis-Plus 同款 ES ORM 框架,用起来够优雅!
java·后端·elasticsearch
用户03321266636718 小时前
Java 查找并替换 Excel 中的数据:详细教程
java
间彧18 小时前
ThreadLocal实现原理与应用实践
java
若水不如远方19 小时前
Netty的四种零拷贝机制:深入原理与实战指南
java·netty
用户74936368484319 小时前
【开箱即用】一分钟使用java对接海外大模型gpt等对话模型,实现打字机效果
java
SimonKing19 小时前
一键开启!Spring Boot 的这些「魔法开关」@Enable*,你用对了吗?
java·后端·程序员