Java 回调函数(传统方法和lambda方法)-一个例子秒懂
原文地址为: Java 回调函数(传统方法和lambda方法)-一个例子秒懂
背景:
想写一个工具类 Tool.java ,其中方法 public void readOneLine() 负责一行一行地读文件,然后根据不同的业务,对每一行进行不同处理。最后输出到文件 out.txt
那么问题来了,根据不同的业务,进行不同处理 怎么实现?
自然而然想到,每个业务有一个对读取的一行的处理方法 public void 业务名(),我们把方法作为参数传入 public void readOneLine(业务名()),比如:
业务A:readOneLine(直接输出每一行())业务B:readOneLine(每一行全部大写后输出())业务C:readOneLine(输出每一行的第一个单词())......
很可惜,java 7不支持这样的语法,也许java 8 的 lambda 表达式可以?这不在今天讨论的范围里
java 7 要实现这样的功能需要通过回调函数
回调函数 - A类中调用B类中的某个方法methodB(),然后 methodB() 中反过来调用A类中的methodA()。methodA()这个方法就叫回调函数
一个同步回调函数的例子
回调函数接口,这个接口是必须的吗?
是。不仅为了符合面向接口编程的规范
事实上,调用方将会 Override 接口的 具体业务逻辑(),达到传函数给被调用方的目的。
//回调函数接口及方法 public interface 业务逻辑 { public void 具体业务逻辑(); }
public class Tool { private 业务逻辑 yewuluoji; //私有接口成员 public void setYewuluoji(业务逻辑 yewuluoji){this.yewuluoji = yewuluoji; }public void 工具类逻辑() {//读文件while(每一行){ yewuluoji.具体业务逻辑(); } } }
测试类:
public class MainClass { public MainClass() { } public static void main(String[] args) { Tool tool = new Tool(); //传入 匿名实现类,包含具体业务逻辑 tool.setCallback(new 业务逻辑{@Overridepublic void 具体业务逻辑() {//输出每一行的第一个单词 } });
tool.工具类逻辑(); //此方法中回调匿名类的具体业务逻辑(),即:输出每一行的第一个单词 } }
java 8 lambda方式传函数(仅仅是语法糖?)
匿名类型最大的问题就在于其冗余的语法。有人戏称匿名类型导致了“高度问题”(height problem):比如前面ActionListener的例子里的五行代码中仅有一行在做实际工作。
lambda表达式是匿名方法,它提供了轻量级的语法(语法糖?),从而解决了匿名内部类带来的“高度问题”。
下面是一些lambda表达式:
(int x, int y) -> x + y() -> 42(String s) -> { System.out.println(s); }
lambda表达式的语法由参数列表、箭头->(等价于return)和函数体组成。函数体既可以是一个表达式,也可以是一个语句块:
lambda表达式也会经常出现在嵌套环境中,比如说作为方法的参数。为了使lambda表达式在这些场景下尽可能简洁,我们去除了不必要的分隔符。不过在某些情况下我们也可以把它分为多行,然后用括号包起来,就像其它普通表达式一样。
下面是一些出现在语句中的lambda表达式:
FileFilter java = (File f) -> f.getName().endsWith("*.java");
String user = doPrivileged(() -> System.getProperty("user.name"));
new Thread(() -> { connectToService(); sendNotification();}).start();
转载请注明本文地址: Java 回调函数(传统方法和lambda方法)-一个例子秒懂
Java 回调函数(传统方法和lambda方法)-一个例子秒懂相关推荐
- java——Scanner中nextLine()方法和next()方法的区别
遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Sc ...
- Java并发编程—schedule方法和scheduleAtFixedRate方法的区别
原文作者:一叶丿清风 原文地址:schedule方法和scheduleAtFixedRate方法的区别 schedule方法和scheduleAtFixedRate方法都可以实现任务的延时和不延时执行 ...
- 普歌-码灵团队-java中的equals方法和toString方法及总结
普歌-码灵团队:Object类中的方法介绍及其用法 一.Object类 二.方法介绍 1.toString方法 2.重写equals方法: 3. 拓展 三.总结 一.Object类的简单介绍 二.Ob ...
- Java类型转换中valueOf方法和parseInt方法的区别
在Java的类型转换中,我们经常会使用valueOf或者parseInt(parseFloat/parseDouble等)来转换.这二者有什么区别呢?我们看如下的代码: String inputVal ...
- Java中的compare方法和conpareTo方法使用详解
一.compare方法 一般用在优先级队列和重写Arrays.sort中,新建比较器,重写compare方法 1.1 优先级队列中使用(比较器后一个元素为大的) 例如:使用小顶堆找最大TopK就构造了 ...
- flush方法和close方法的区别
package com.learn.Demo05Writer;import java.io.FileWriter; import java.io.IOException;/*flush方法和close ...
- Java 8 辣么大(lambda)表达式不慌之—–(四)示例-Collectors中的中的joining 方法和mapping方法
Java 8 辣么大(lambda)表达式不慌之-–(四)示例-Collectors中的joining 方法和mapping方法 joining 方法 mapping方法 先定义好后面做示例要用的数据 ...
- java重写6,java重写equals()方法和hashCode()方法
1.equals()方法和hashCode()方法是什么? equals()和hashCode()都是是Java中万物之源Object类中的方法: equals方法用于比较两个对象是否相同,Objec ...
- Java hashCode()方法和equals()方法
hashCode方法和equals方法之间的关系: equals方法指示其他一个对象和此对象是否相等.在Object类中定义如下: public boolean equals(Object obj) ...
最新文章
- poj3565(最大权完美匹配)
- python拷贝文件函数_Python Set集合,函数,深入拷贝,浅入拷贝,文件处理
- loadrunner录制事件为0_Oracle数据库性能监控|LoadRunner 中配置监控Oracle
- spark任务shell运行_大数据系列:Spark的工作原理及架构
- zabbix 自定义探索规则发现服务器上面的kvm虚拟机和对应的网卡
- byte转换为string乱码_每日一课 | 如何将int转换为String
- unittest-ddt报错AttributeError: type object ‘forTestDDT‘ has no attribute ‘test_2‘
- 学习MySQL / MariaDB初学者 - 第1部分
- 5,线程池,进程池,协程,IO模型
- 【kafka】kafka record is corrupt(记录损坏)
- ASP.NET中 CheckBox(复选框)的使用
- Excel学习笔记之基础篇
- java爬取闲鱼商品信息(一)
- application.yaml配置详解
- 快慢指针慢指针和快指针一定会相遇
- python 线程安全队列_Python实现线程安全队列
- linux给串口赋予权限
- 计算机视觉入门知识一:数据分类基础 (李飞飞斯坦福计算机视觉课程)
- 怎样才能批量查询网站的谷歌PR权重?把手教你批量查询网站谷歌PR权重值
- IDA7.0 MacOS报错Oops,IDA has almost crashed!解决方案
热门文章
- ill-posed problem,regularized method,正则化参数的选取
- 单源最短路的建图方式(Dijkstra)
- 知其然也要知其所以然---Kernel上报电量UEvent事件流程分析
- 龙芯可以运行linux吗,开源的龙芯主板可顺利启动Linux系统
- 官宣!首个大模型兴趣小组开放申请,专注大模型应用落地
- python打印字符串格式_Python字符串三种格式化输出
- NX二次开发-输入X向量Y向量输出一个3*3矩阵UF_MTX3_initialize
- Ubuntu系统上远程桌面,samba,ftp,vncserver,ssh服务器,teamviewer安装配置
- Orcad BOM整理与核实的方法
- mfc创建excel如何另存为_MFC实现excel的读写操作