关于Java的惰性求值
最近在学scala的时候,函数传参可以是传名参数,或者传值参数
1.Scala中的传名参数是什么意思?lazy关键字有什么作用?
Scala官方文档的定义是:传名参数 仅在被使用时触发实际参数的求值运算。 它们与 传值参数 正好相反。 要将一个参数变为传名参数,只需在它的类型前加上 =>。
def calculate(input: => Int) = input * 37
测试输出
def main(args: Array[String]): Unit = {
def input(): Int ={
println("Initialized")
1
}
lazy val i = input();
println("begin for loop")
for( a <- 1 to 3){
val cal = calculate(i)
println("cal:" + cal)
}
}
output:
begin for loop
Initialized
cal:37
cal:37
cal:37
可以看到Initialized
是在begin for loop
后面打印出来,而且可以看到Initialized
在三次循环调用中,只输出了一次,这是因为有缓存的,只会在第一次使用的时候进行初始化。
2.在Java中如何实现类似的功能?
其实单纯的惰性求值,是很好实现的,可以通过Java 8 中的 functional interface Supply
来传递参数。
public static Integer calculate(Supplier<Integer> s) {
return s.get() * 37;
}
public static void main(String[] args) {
Supplier<Integer> input = () -> {
System.out.println("Initialized");
return 1;
};
System.out.println("begin for loop");
for (int i = 0; i < 3; i++) {
Integer cal = calculate(input);
System.out.println("cal:" + cal);
}
}
output:
begin for loop
Initialized
cal:37
Initialized
cal:37
Initialized
cal:37
可以看到虽然实现了惰性求值,但是每次调用的时候supplier都会去计算一遍,这个时候可以用guava提供的MemoizingSupplier
。
public static Integer calculate(Supplier<Integer> s) {
return s.get() * 37;
}
public static void main(String[] args) {
//这里返回的其实是MemoizingSupplier
com.google.common.base.Supplier<Integer> input = Suppliers.memoize(() -> {
System.out.println("Initialized");
return 1;
});
System.out.println("begin for loop");
for (int i = 0; i < 3; i++) {
Integer cal = calculate(input);
System.out.println("cal:" + cal);
}
}
output:
begin for loop
Initialized
cal:37
cal:37
cal:37
通过输出可以看到,实现的效果和scala是一样的,做到了惰性求值,且有缓存,只会被执行一次。
关于Java的惰性求值的更多相关文章
- Stream01 定义、迭代、操作、惰性求值、创建流、并行流、收集器、stream运行机制
1 Stream Stream 是 Java 8 提供的一系列对可迭代元素处理的优化方案,使用 Stream 可以大大减少代码量,提高代码的可读性并且使代码更易并行. 2 迭代 2.1 需求 随机创建 ...
- C#函数式编程之惰性求值
惰性求值 在开始介绍今天要讲的知识之前,我们想要理解严格求值策略和非严格求值策略之间的区别,这样我们才能够深有体会的明白为什么需要利用这个技术.首先需要说明的是C#语言小部分采用了非严格求值策略,大部 ...
- 惰性求值——lodash源码解读
前言 lodash受欢迎的一个原因,是其优异的计算性能.而其性能能有这么突出的表现,很大部分就来源于其使用的算法--惰性求值. 本文将讲述lodash源码中,惰性求值的原理和实现. 一.惰性求值的原理 ...
- c++11实现l延迟调用(惰性求值)
惰性求值 惰性求值一般用于函数式编程语言中,在使用延迟求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在后面的某个时候求值. 可以利用c++11中的std::function, lam ...
- GString惰性求值
当对一个GString实例求值时,如果其中包含一个变量,该变量的值会被简单地打印到一个Writer,通常是一个StringWriter.然而,如果GString中包含的是一个闭包,而非变量,该闭包就会 ...
- Java描述表达式求值的两种解法:双栈结构和二叉树
Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...
- 蓝桥杯算法训练 java算法 表达式求值
问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...
- java实现表达式求值 (20 分)-------非递归版
Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近由学会了一些简单的函数求值.比如,它知道函数min(20, 23)的值是20, add(10, 98)的值是108等等.经过训练,Dr.Kong ...
- [Java]算术表达式求值之三(中序表达式转二叉树方案 支持小数)
Entry类 这个类对表达式的合法性进行了粗筛: package com.hy; import java.io.BufferedReader; import java.io.IOException; ...
- [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)
Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...
随机推荐
- 四种语言刷算法之删除链表的倒数第 N 个结点
力扣19. 删除链表的倒数第 N 个结点 1.C /** * Definition for singly-linked list. * struct ListNode { * int v ...
- sql语句顺序/包含执行顺序和书写顺序
分页查询 如果一页记录为10条,希望查看第3页记录应该怎么查呢? 第一页记录起始行为0,一共查询10行: 第二页记录起始行为10,一共查询10行: 第三页记录起始行为20,一共查询10行: ...
- 【4】Postman之Tests(断言)
简介:使用postman完成请求后,验证返回结果,会用到tests断言.官方提供了很多可以直接使用的方法~ 接下来主要介绍这些方法是如何使用. 1. 变量相关: Get an environment ...
- Window 连接linux系统上的Redis
windows 设置连接linux redis 一.查看linux 6379端口是否开发 firewall-cmd --query-port=6379/tcp 如果返回no则端口没有开启 fire ...
- 2022-05-23内部群每日三题-清辉PMP
1.在项目执行过程中,职能经理识别到有关外包团队的新内部风险,职能经理要求项目经理提供一个不会对项目产生负面影响的快速解决方案.项目经理应该怎么做? A.制定风险分解结构(RBS) B.根据影响的严重 ...
- 自定义Lock实现
1 package com.wyt.lock.test; 2 3 import java.util.concurrent.LinkedBlockingQueue; 4 import java.util ...
- JAVA诞生历史【转载】
一.计算机语言的发展史 1.第一代语言(只有机器能读懂,人根本读不懂) 纯机器语言 2.第二代语言(机器能读懂,人可以读懂,但是很难懂) 汇编语言(符号语言) 3.第三代语言(机器能读懂,也非常便于人 ...
- 图片视频二进制流base64加密
一:读取图片或者视频,转换二进制流,进行Base64加密 @PostMapping("/base64Encoder") public StringBuilder changeIma ...
- Python3.6多线程爬虫
Python版本 3.6 简单写一个爬虫,在写的过程熟悉Python语法,不得不说Python用起来真666; 代码功能是访问网站首页将所有a标签值作为文件夹,将当前网页所有图片下载对应文件夹中;其实 ...
- 使用NSIS打包软件
平台和所需软件 平台: Windows 使用软件: NSIS https://nsis.sourceforge.io/Download HM NIS Edit https://sourceforge. ...