上一讲,我们了解了如何解决java的回调地狱的问题,但是上一讲我们使用的是java的abstract类的方式。考虑到Java8新特性lambda的可读性,今天我改写一个使用lambda的方案,大体方式不变,调用方法改为如下:

new Promise((_this, n) -> {

System.out.println("hello1 n:" + n);

_this.resovle(1);

}).then((_this, n) -> {

System.out.println("hello2 n:" + n);

_this.resovle(2);

}).then((_this, n) -> {

System.out.println("hello3 n:" + n);

_this.resovle(3);

}).then((_this, n) -> {

System.out.println("hello4 n:" + n);

_this.resovle(4);

}).end();

可以看到,现在的方法使用的是构造函数,声明一个lambda对象给类Promise,本方法的写法确实比之前的方法简洁,但是相对之前的方法,却需要引入两个文件。

首先需要引入一个CallBack.java的接口用于接收lamdba对象。

package REDIS;

@FunctionalInterface

public interface CallBack {

void run(Promise _this, int n);

}

然后修改Promise.java为如下文件:

package REDIS;

public class Promise {

private Promise lastPromise = null;

private Promise beforePromise = null;

private CallBack cb = null;

public Promise () {

}

public Promise (CallBack cb) {

this.cb = cb;

}

public void end () {

if (beforePromise != null) {

beforePromise.end();

} else { // 寻找第一个Promise对象,然后执行它

cb.run(this, 0);

}

}

public Promise then (CallBack cb) {

if (cb == null) {

end ();

return null;

}

Promise lastPromise = new Promise(cb);

this.lastPromise = lastPromise; // 赋值当前的Promise对象下一个Promise对象引用

lastPromise.beforePromise = this; // 赋值下一个Promise对象,它的上一个对象引用

return lastPromise;

}

public void resovle (int n) { // 这里的n是一个参数用户传递给下一个run,根据需求类型可以更改

if (lastPromise == null) {

return;

}

beforePromise = null; // 将上一个Promise的指针置空,方便gc回收

lastPromise.cb.run(lastPromise, n); // 执行下一个Promise的run方法

}

}

可以看到,经过修改的Promise依旧是通过new一个新的Promise来实现的,本来嘛的执行效果如下:

G:\gradletest>java -jar dist\\gradletest.jar

Hello world

hello1 n:0

hello2 n:1

hello3 n:2

hello4 n:3

java地狱_解决java回调地狱的方法相关推荐

  1. 如何解决异步回调地狱

     //promise解决回调地狱问题 function eat(fn) { setTimeout(() => { fn('吃饭') }, 2000) } function xizao(fn) { ...

  2. java 找不到或无法加载类_解决Java中找不到或无法加载主类错误

    场景: 使用java命令运行.class文件时出现:"错误: 找不到或无法加载主类": 原因: 1.java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定 ...

  3. JAVA解决实例问题_解决java方法

    没有R.java问题找不到getActionBar()方法 android项目,可是项目中没有重要的R.java,并且报错,说是找不到getActionBar()方法,上网寻找原因,终于寻得解决方法: ...

  4. java键盘监听延迟_解决JAVA键盘监听的延迟现象以及八个方向的运动

    首先解释一下键盘出现延迟的原因: 其实键盘为了用户体验,在按下一次按键之后,会有片刻的延迟,为什么会这样呢? 你想一下,当你打一个字母时,连着出来了好几个字母,你心里面的感受是怎么样的? 所以嘛,键盘 ...

  5. java编译报错提示编码gbk的不可映射字符啥意思_解决java编译错误:编码GBK的不可映射字符...

    [我的Android进阶之旅]解决Android Studio 运行gradle命令时报错: 错误: 编码GBK的不可映射字符 1.问题描述 最近在负责公司基础业务和移动基础设施的开发工作,正在负责L ...

  6. java csv导出用excel打开乱码_解决Java以UTF-8导出的CSV文件用Excel打开乱码

    项目中导出或下载的CSV文件,默认打开方式一般都是Excel.若文件中有中文或者日文时,显示内容就会乱码,但是如果用文件编辑器记事本之类的打开显示内容是正常的.首先解释一下为什么会有这种现象,之后给出 ...

  7. java 插入 mysql 乱码_解决java中插入mysql中文乱码的方法

    解决java中插入mysql中文乱码的方法 发布时间:2020-07-11 14:35:11 来源:亿速云 阅读:100 作者:清晨 这篇文章主要介绍解决java中插入mysql中文乱码的方法,文中介 ...

  8. java类型转换异常_解决java.lang.ClassCastException的java类型转换异常的问题

    解决java.lang.ClassCastException的java类型转换异常的问题,异常,对象,错误,给大家,会报 解决java.lang.ClassCastException的java类型转换 ...

  9. java 命令 乱码_解决java 命令行乱码的问题

    虚拟机参数加上 -dfile.encoding=gbk -ddefault.client.encoding=gbk -duser.language=zh -duser.region=cn 补充:jav ...

最新文章

  1. .NET平台BigO算法复杂度备忘
  2. main()与_tmain()区别
  3. 手把手·从零开始撸Docker 系列一
  4. Linux安装以太坊geth客户端
  5. php 扩展 返回字符串,PHP扩展函数返回字符串一定需要使用spprintf吗?
  6. 95-136-040-源码-Operator-Operator简介
  7. OpenShift Security 14 - 使用 RHACS 中的进程基线功能找出在容器中运行的风险操作
  8. 开发人员如何高效编程?
  9. 机器学习与深度学习基础概念介绍
  10. reticulate: R interface to Python
  11. 一些自己使用VS2015的心得
  12. 基于云服务器ECS搭建网页游戏《浪剑天下》
  13. HTC Vive开发笔记之手柄震动
  14. 《Turtle绘图》Python用Turtle库绘制多啦爱梦、小猪佩奇、皮卡丘等卡通人物
  15. pycharm连接云端服务器后实现远程debug调试
  16. matlab中m文件是什么,MATLAB中M文件的使用
  17. BLE协议栈 – L2CAP
  18. 洛谷P1233 木棍加工
  19. 无间道中毒综合征(影迷朋友过来看看)
  20. PHP SAPI(FCGI)个人整理

热门文章

  1. python加粗_python 加粗
  2. 如何在低谷时不至于荒废时间乃至于得到最大化的进步升华 [转]
  3. Nacos分级存储模型,权重配置,环境隔离
  4. 腾讯云添加8443端口
  5. java毕业设计闲置物品交易系统mybatis+源码+调试部署+系统+数据库+lw
  6. idea自动补全只有左括号,缺少右括号的问题解决
  7. AGV机器人是如何工作的
  8. left join查询on后面的条件过滤失效的问题
  9. Ubuntu安装Java环境
  10. 微信公众平台开发(PHP)(七) 聊天机器人功能开发