Java8:Stream概念的细化,讨论延迟计算/惰性求值Lazy Evaluations。

Java中常见的逻辑操作be1&&f(),是短路/short-circuiting计算,避免了执行不必要的表达式或方法调用。它使用的就是惰性求值或者说正常顺序/normal order(SICP中译为正则序);与此同时,方法实参的求值是饥饿或者说应用序/applicative order,在方法被调用前,所有的实参通通被求值,即使方法中不使用某些实参也被求值。

JDK中,Stream的中间函数如 filter(Predicate super T>)是惰性求值的,filter并非对流中所有元素调用传递给它的Predicate,Java8:Stream概念中我们见过,调换map()和filter()函数的调用顺序,可以减少函数执行的次数。我们可以借鉴它,设计方法实参的惰性求值,手段是将形参转化为函数接口,因为实参的lambda表达式在被调用时才求值。

例如有一个方法执行很长时间的运算(sleep模拟)后返回i>0。

public static boolean isPositive(int i) {

pln("test ..." + i);

sleep(1000);//

return i > 0;

}

因为方法实参的求值是饥饿的,对于下面的代码

public static void eagerTest(boolean be1, boolean be2) {//方法实参的求值是饥饿的

pln(be1 && be2); //实参

isPositive(-1) && isPositive(2); //&&是短路的

}执行eagerTest(isPositive(-1), isPositive(2));的输出为:

test ...-1

test ...2

false

test ...-1

false

实参的lambda表达式在被调用时才求值

public static void lazyTest(Supplier supplier1, Supplier supplier2) {

pln((supplier1.get() && supplier2.get()));

}

static class imp implements Supplier{

@Override public  Boolean get(){

return isPositive(-2);

}

}

public static void test() {

//eagerTest(isPositive(-1), isPositive(2));

pln("lazyTest-------------1");

lazyTest(() -> isPositive(-1), () -> isPositive(2));

pln("lazyTest-------------2");

lazyTest( new imp(), () -> isPositive(2)  );

pln("lazyTest-------------3");

lazyTest( new Supplier(){

@Override public  Boolean get(){

return isPositive(-3);

}

}, () -> isPositive(3)  );

}执行test()的输出为:

lazyTest-------------1

test ...-1

false

lazyTest-------------2

test ...-2

false

lazyTest-------------3

test ...-3

false

在进入lazyTest方法体之前,作为实参的两个lambda表达式并没有求值,而在调用supplier1.get()时才会求值。

java延迟函数_Java 8:延迟计算相关推荐

  1. java 匿名函数_Java 理论与实践,闭包之争

    Java 语言是否应增加闭包以及如何添加? 在跨越边界 系列最近的一篇文章中,我的朋友兼同事 Bruce Tate 以 Ruby 为例描述了闭包的强大功能.最近在安特卫普召开的 JavaPolis 会 ...

  2. java 字符串函数_Java字符串函数– 25+必须知道方法

    java 字符串函数 Java字符串函数 (Java String Functions) Java String class has a lot of functions to manipulate ...

  3. java日期函数_JAVA 日期、时间函数大全(超全)

    实 习期间使用ExtJs做项目的时候需要获取上下班时间并进行上网访问记录的截取和判断,需要处理时间以及字符串与时间之间的转换.本想自作一篇关于时间的 博文,但发现java时间函数方式多变,不如上网查资 ...

  4. java lambda函数_Java SE 8新功能介绍:使用Lambda Expression进行函数式编程

    java lambda函数 " Java SE 8新功能浏览 "系列的这篇文章将深入了解Lambda表达式 . 我将向您展示Lambda表达式的几种不同用法. 它们都具有功能接口的 ...

  5. java虚拟函数_java实现多态中的虚函数相关概念

    本文转载自参考博客 1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加上virtual关键字就成为虚函数 Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑 ...

  6. java 虚函数_Java的虚方法

    虚方法出现在Java的多态特性中, 父类与子类之间的多态性,对父类的函数进行重新定义.如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).在Java中,子类 ...

  7. java 整型_Java整型计算

    整型计算 今天做LeetCode看到一道题,翻转整型,其中一行代码if ((newResult - tail) / 10 != result)表示超出范围就会有损失,有点不太明白,正好之前复习过原码, ...

  8. java arraylist 函数_Java Extend ArrayList函数

    让我说我有 class Dummy { String a, b; public Dummy(String a, String b) { this.a = a; this.b = b; } public ...

  9. java equals() 函数_java equals()函数与‘==’

    谈到java的字符串比较函数equals(),就不得不说它真真的用途啦!虽然只是java里面一个简单的知识点, 还是有必要扯扯它,因为有许多学习java的小伙伴在比较字符串上纠结与equals()和' ...

最新文章

  1. 【AGC+FPGA】基于FPGA的数字AGC自适应增益设计,应用在BPSK调制解调系统中
  2. 《大话数据结构》第9章 排序 9.3 冒泡排序(上)
  3. Java的Locale类
  4. [Leetcode] Reverse Integer
  5. Netty 4.x – ByteBuf
  6. WordPress后台删除不需要的侧边栏菜单
  7. 推荐系统(2)-协同过滤1-UserCF、ItemCF
  8. mysql查询没有权限试图_MySQL迁移后提示查询view权限不足的处理
  9. 玩ts要注意什么_幼儿园装修要注意什么
  10. CentOS7下安装JDK及IDEA
  11. ssh:could not resolve hostname XXX:Temporary failure in name resolution
  12. FdfsConnectException:无法获取服务端资源:cant creat connection to /ip timeout
  13. lb开金矿 QDUOJ 数论
  14. linux禁止程序访问网络,linux内核强制访问控制--Apparmor
  15. centos7利用docker 快速搭建苹果CMS站点
  16. python脚本实现GNSS数据自动下载
  17. python基础day-15:time、hash、json
  18. 电子商务-任务分配背景会议
  19. 100天精通Andriod逆向——第3天:真机环境配置
  20. git-flow图解

热门文章

  1. android通话记录列表apk,android打电话,发短信,获取通讯录、通话记录、短信记录...
  2. 干净卸载mysql (注册表)
  3. 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】
  4. 欧拉定理扩展欧拉定理(证明)
  5. jQuery的Ajax初识
  6. 在微信小程序中调用本地接口
  7. 操作系统(五)CPU调度
  8. Codeforces 919 D Substring
  9. python 读帧和绘图的区别
  10. UIGestureRecognizer学习笔记