java中延迟_Java中的延迟分配

java中延迟

程序员本质上是懒惰的,而similis simili gaudet就像程序是懒惰的一样。 您听说过延迟加载吗? 还是懒惰的单身人士? (不过,我个人更喜欢单一麦芽版本。)如果使用Scala或Kotlin(这也是一种JVM语言)进行编程,则您甚至可以以惰性方式评估表达式。

如果您在Scala中编程,则可以编写

 lazy val z = "Hello" 

并且仅在首次访问z时才对表达式求z 。 如果您在Kotlin编程,您可以编写类似

 val z: String by lazy { "Hello" } 

并且仅在首次访问z时才对表达式求z

Java本身不支持这种惰性评估,但是作为一种功能强大的语言,Java提供了可用于获得相同结果的语言元素。 Scala和Kotlin会给您鱼,而Java会教您捕获自己的鱼。 (让我们在这个想法中发挥作用。)

当您在Scala和/或Kotlin中对以上行进行编码时,在后台真正发生的事情是不对表达式进行求值,并且变量将不保存表达式的结果。 相反,这些语言会创建一些虚拟的“ lambda”表达式,这是一个“供应商”,以后将用于计算该表达式的值。

我们可以用Java自己完成。 我们可以使用一个简单的类Lazy提供以下功能:

 public class Lazy implements Supplier {  final private Supplier supplier;  supplied = private boolean supplied = false ;  private T value;  private Lazy(Supplier supplier) {  this .supplier = supplier;  }  public static Lazy let(Supplier supplier) {  return new Lazy(supplier);  }  @Override  public T get() {  if (supplied) {  return value;  }  supplied = true ;  return value = supplier.get();  }  } 

该类具有可用于定义供应商的public static方法let() ,并且在首次调用方法get()会调用此供应商。 使用此类,您可以将以上示例编写为

 var z = Lazy.let( () -> "Hello" ); 

顺便说一句,它似乎比Kotlin版本更简单。 您可以使用库中的类:

 com.javax0  lazylet  1.0.0 

然后您无需将代码复制到您的项目中。 这是一个微型库,仅包含此类和一个内部类,该内部类使Lazy可以在多线程环境中使用。

使用很简单,如单元测试所示:

 private static class TestSupport {  int count = 0 ;  boolean callMe() {  count++;  return true ;  }  }  ...  final var ts = new TestSupport();  var z = Lazy.let(ts::callMe);  if ( false && z.get()) {  Assertions.fail();  }  Assertions.assertEquals( 0 , ts.count);  z.get();  Assertions.assertEquals( 1 , ts.count);  z.get();  Assertions.assertEquals( 1 , ts.count); 

要获取多线程安全版本,可以使用以下代码:

 final var ts = new TestSupport();  var z = Lazy.sync(ts::callMe);  if ( false && z.get()) {  Assertions.fail();  }  Assertions.assertEquals( 0 , ts.count);  z.get();  Assertions.assertEquals( 1 , ts.count);  z.get();  Assertions.assertEquals( 1 , ts.count); 

并获得可以由多个线程使用的Lazy供应商,但仍可以保证作为参数传递的供应商仅传递一次。

给你一条鱼或教你钓鱼

我说要在便签上写上别针:“虽然Scala和Kotlin给您的鱼,但是Java教您捕捉自己的鱼。” 这就是我的意思。

许多程序员在不了解程序如何执行的情况下编写程序。 他们使用Java编程并且编写了不错的代码,但是他们不知道底层技术如何工作。 他们对类加载器,垃圾回收一无所知。 或者他们知道,但是他们对JIT编译器生成的机器代码一无所知。 或者他们甚至这样做,但他们对处理器缓存,不同的内存类型,硬件体系结构一无所知。 或者他们知道但不了解微电子学和光刻技术,以及集成电路的布局,电子在半导体内部的移动方式,量子力学如何确定计算机的不确定内部工作方式。

我并不是说您必须是物理学家,并且要了解量子力学的复杂细节才能成为优秀的程序员。 但是,我建议您了解日常工作工具下面的几层内容。 如果您使用Kotlin或Scala,则绝对可以使用它们提供的惰性结构。 在这种特定情况下,它们使编程抽象比Java提供的编程抽象高一个级别。 但是,至关重要的是要知道实现的外观。 如果您知道如何钓鱼,则可以购买包装鱼,因为这样您就可以分辨出什么时候才是好鱼。 如果您不知道如何钓鱼,您将依靠那些给您钓鱼的人的怜悯。

翻译自: https://www.javacodegeeks.com/2019/05/lazy-assignment-java.html

java中延迟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

camel apache_短款Apache Camel K

camel apache您可能已经看到我们在Camel K周围的Apache Camel社区中所做的工作。 Nicola于半年前在他的博客中介绍了Camel K , 就在几个月前,我们正在讨论一个新项目,该项目可以作为Apache Camel的一部分启动。 一个有可能改变人们处理集成方…

java 栈 队列 接口_Java队列接口

java 栈 队列 接口介绍: 队列是FIFO(先进先出)抽象数据类型(ADT)。 换句话说,按插入顺序将元素删除。 java.util.Queue是Java 中的接口,并且从java.util.Collection扩展。 一些常用的Queue实现…

jakarta ee_Jakarta EE 8状态

jakarta ee遵循Jakarta EE的人们可能知道即将发布的Jakarta EE 8在功能上将与Java EE 8等效。其原因是我们想证明从Oracle的传输已经完成,并且我们能够产生这些流程,规范,测试套件以及通过Eclipse Foundation的兼容实现。 到目前为止&#x…

IntelliJ IDEA如何查看接口的实现类以及如何查看被实现的接口

在接口的左边有个向下的小箭头,点击小箭头就能看到接口的实现类和方法的实现: 在实现类的左边有个向上的小箭头,可以查看被实现的接口和被覆盖重写的方法:

c#自定义控件资源释放问题_定义资源

c#自定义控件资源释放问题在Fielding的论文中 ,资源描述为: “可以命名的任何信息”……“文档或图像,临时服务(例如,“洛杉矶今天的天气”),其他资源的集合,非虚拟对象&#xff08…

MySQL数据库存入日期(java.sql.Date)数据,天数会少一天的问题

网络上给的解决办法: 这是数据库服务器时区的问题,即连接参数 serverTimezone 的问题,默认情况下 serverTimezoneUTC,改成 HongKong 或者 Asia/Shanghai 就可以了。如下所示: jdbc:mysql://localhost:3306/test?useU…

spring的bean范围_Spring Bean范围

spring的bean范围介绍: Spring核心容器实例化bean并管理其生命周期。 在定义bean时,我们可以提供其范围。 除非明确提供,否则单例是Spring容器中Bean的默认范围。 Spring提供了五种类型的bean作用域。 在本教程中,我们将探讨它们…

java.util.Date转换成java.sql.Date

// 获取当前的系统时间,以java.util.Date对象返回 Date dateUtil new Date(); // 获取当前的系统时间,以时间戳返回 long l System.currentTimeMillis();时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现…

省编码市编码区县编码_无浪费编码

省编码市编码区县编码本文介绍了如何通过减少软件堆栈中的浪费来高效解决有意义的事件处理问题。 Java通常被视为无法在低内存环境中有效运行的内存猪。 目的是证明许多人认为不可能的事情,有意义的java程序几乎可以在没有内存的情况下运行。 示例流程 在Java的单…

Java日期时间字符串和毫秒相互转换的方法

参考链接: 1.https://www.jb51.net/article/130195.htm 2.https://blog.csdn.net/yhj19920417/article/details/73799842?locationNum10&fps1

谷歌本地不支持websocket_django开发-websocket的实现

今天介绍下如何在django中使用channels实现websocket。其实还可以使用dwebsocket实现websocket,这里不做介绍。首先介绍一个概念ASGI。ASGI异步网关协议接口,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型&…

我要正式开始《一个项目征服Java中高级体系》

在互联网上经常看到很多人说35岁危机的问题、大厂裁员、互联网寒冬这些问题。我感觉比较幸运的是,在之前大环境还不是很坏时候就被裁了一次,所以我很早就开始做持续的准备,现在不好说一定能怎么样, 至少自己在持续的探索适合自己的…

cuba 平台_CUBA 7的新功能

cuba 平台三年前,我们宣布了该框架的第二个公开可用的主要版本。 CUBA 6是改变游戏规则的版本–许可从专有转为Apache 2.0。 那些日子,我们甚至无法猜测从长远来看它将把框架带到哪里。 CUBA社区开始呈指数级增长,因此我们了解了开发人员如何…

java.util.Date详解

获取当前的系统时间: Date date new Date();获取毫秒数: long time date.getTime();毫秒数转成 Date 对象: long l 23434324324343L; Date date new Date(l);比较两个 Date 对象: SimpleDateFormat sdf new SimpleDateFo…

夸克代码_关于夸克的思考

夸克代码Quarkus,新的“超音速,亚原子” Java框架目前正受到广泛关注。 对于企业Java的未来而言,此构建和运行时工具背后的思想确实比我们感兴趣。 使用Quarkus有什么好处和缺点? 摆脱动力 Quarkus认为,在容器化的世…

ntdll 异常代码0xc0000374_不要把异常当做业务逻辑,这性能可能你无法承受

一:背景1. 讲故事在项目中摸爬滚打几年,应该或多或少的见过有人把异常当做业务逻辑处理的情况(┬_┬),比如说判断一个数字是否为整数,就想当然的用try catch包起来,再进行 int.Parse,如果抛异常就说明不是整…

java中的hashset_Java中的HashSet

java中的hashset介绍: Java中的HashSet实现Set接口,即它不允许重复。 它在内部由HashMap支持,该哈希表基于哈希原理。 我们可以在HashSet中存储一个空值。 默认容量为16,负载系数为0.75,其中: Load facto…

win32bridge.server.exe函数不正确_修电脑?不,其实我们学的是......

COMPUTER计信学子Python?JAVA?C?C?HTML?身为重师计信人逢年过节总免不了被亲戚们“盘问”一番必问清单第一名就是“专业”他们往往从字面去理解而我们计信人被误解的频率相当高“学计算机的肯定会修电脑对吧”请接着看下去吧!我们学的到底是什么?(点击查看答案…

SimpleDateFormat详解

SimpleDateFormat 中的时间标识含义: G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午 (1~12) H 时 在一天中 (0~23) m 分 s 秒 S 毫秒 E 星期 D 一年中的第几天 F 一月中第几个星期几 w 一年中第几个星期 W 一月中第几个星期 a 上午 / 下午 标记符 k 时 在一天中 …

java uuid_Java UUID

java uuid介绍: UUID(通用唯一标识符)表示一个128位长的唯一值 。 它也被普遍称为GUID(全球唯一标识符)。 UUID的标准表示形式由十六进制数字组成: 533a4559-e55c-18b3-8456-555563322002并具有36个字符 …