当前位置: 首页 > news >正文

函数式接口当参数使用

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

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);}
}

数据处理不同的策略:

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> {@Overridepublic 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> {@Overridepublic Object apply(List<Integer> integers) {return integers.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));}
}
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))));}
}

相关文章:

  • Day01-变量和数据类型课后练习(输出你最想说的一句话,定义所有基本数据类型的变量和字符串变量,用合适类型的变量存储个人信息并输出,定义圆周率PI,简答题)
  • Chrome for Developer 第一章(打开 Chrome 开发者工具)
  • flink-java使用介绍,flink,java,DataStream API,DataSet API,ETL,设置 jobname
  • [嵌入式系统-4]:龙芯1B 开发学习套件-1-开发版硬件介绍
  • 【微服务】springboot集成ELK使用详解
  • el-table数据更新了,但是展示并没有更新
  • 【幻兽帕鲁】开服务器,高性能高带宽(100mbps),免费!!!【学生党强推】
  • c# 对路径的访问被拒绝
  • Redis在生产环境中可能遇到的问题与解决方案(六)
  • 系统分析师-21年-论文试题
  • k8s 进阶实战笔记 | Scheduler 调度策略总结
  • Python处理日期和时间库之arrow使用详解
  • Qt|大小端数据转换
  • 第17节-高质量简历写作求职通关-投递反馈
  • 人是如何变强的
  • 10个确保微服务与容器安全的最佳实践
  • C++入门教程(10):for 语句
  • const let
  • Elasticsearch 参考指南(升级前重新索引)
  • gf框架之分页模块(五) - 自定义分页
  • js递归,无限分级树形折叠菜单
  • Meteor的表单提交:Form
  • 解决iview多表头动态更改列元素发生的错误
  • 扑朔迷离的属性和特性【彻底弄清】
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 三栏布局总结
  • 小试R空间处理新库sf
  • Nginx实现动静分离
  • RDS-Mysql 物理备份恢复到本地数据库上
  • #if和#ifdef区别
  • #include
  • (搬运以学习)flask 上下文的实现
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)基于IDEA的JAVA基础12
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .net开发引用程序集提示没有强名称的解决办法
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /proc/vmstat 详解
  • @RequestBody与@ModelAttribute
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • []FET-430SIM508 研究日志 11.3.31
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [Android]使用Android打包Unity工程
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [ESP32] 编码旋钮驱动
  • [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入HBASE
  • [hive] sql中distinct的用法和注意事项