函数式接口当参数使用

如果函数式接口作为一个方法的参数,就以为着要方法调用方自己实现业务逻辑,常见的使用场景是一个业务整体逻辑是不相上下的,但是在某一个步骤有不同的逻辑,例如数据处理有不同的策略,如果有大量的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))));
    }
}
相关推荐
sunshine22 girl3 分钟前
Java学习七 Java 项目实战2-注册业务
java·学习
省钱兄--zs25 分钟前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang1 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
sunshine22 girl1 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
code2cat2 小时前
Java进阶篇之AtomicStampedReference:引用回到原值,版本戳仍能记住变化
java·cas·并发编程·aba
泡茶喝茶写代码3 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据
\光辉岁月/4 小时前
7.javase-面向对象
java·开发语言
weixin_531094694 小时前
heap_4内存管理
java·开发语言·算法
程序员南飞4 小时前
win系统安装minio
java·数据结构·算法
Escalating_xu5 小时前
【Python】使用库:标准库、第三方库、pip、项目实战与程序打包
java·python·pip