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

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

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

相关文章

NB-IoT在智能锁领域的应用

随着近几年智能家居行业的火爆,智能锁在生活中出现的频率也越来越高,目前智能锁使用非机械钥匙作为用户识别ID的技术,主流技术有,感应卡,指纹识别,密码识别,面部识别等,极大的提高了…

飞畅 Profibus总线光纤中继器产品介绍

Profibus现场总线光纤中继器,符合Profibus协议,提供拨码开关自由选择Profibus的10种常用速率或速率自适应,单/双光口链网支持。Profibus光纤中继器提供1~2个独立总线电接口和1~2个光纤接口灵活搭配方式,可根据项目实际需求灵活配置…

modbus RTU协议设备使用无线代替有线注意事项

1.设备有线连接 Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接…

AX5243与AX5043方案对比及应用设计

一、 无线组网 成都亿佰特电子科技有限公司是一家致力于自主研发和客户定制需求的创新型公司,基于AX5243、AX5043芯片方案推出的窄带传输产品,针对不同的客户需求和通信距离选择,开发出了一系列包括不同封装、不同频段、不同接口形式和不同…

RS485/232/422串口环网光端机产品介绍

RS485/232/422串口环网自愈光端机,提供2路RS485端口或者1路RS232端口同时在光纤环网上进行双向通讯。一个环网网络中只允许有一个主站,其他均为从站;每一台设备都可以选择工作在主站模式或从站模式。接下来,就由飞畅科技的小编来为…

RS485接口电磁兼容设计方案

概述 RS485接口组成半双工网络,采用平衡驱动器和差分接收器的组合方式,使用屏蔽双绞线传输,抗共模干扰能力强。RS485的电气特性:两线之间的电压差为(2V---6V) 表示逻辑“1”,两线之间的电压差为-(2V---6V)表示逻辑“0…

无线模块在工业控制上的应用

工业控制现状 随着计算机、通信、自动控制、微电子等科学技术的发展,无线通讯在工业控制上的应用越来越广泛。在工业控制应用中,有线传输受环境的影响较大,不利于工业控制。为了加强对工控设备的实时监测和控制,减少环境对传输设…

nashorn 性能_Nashorn简介

nashorn 性能引入了Java 8和名为“ Nashorn”的新JavaScript引擎。 Nashorn基于Da Vinci Machine,该项目旨在为JVM添加动态语言支持。 Nashorn是使混合软件比以前更轻松的一个很好的里程碑。 该引擎的出色功能使您能够在Java(任何其他编译语言&#xff0…

RS485串口光端机产品功能特点介绍

RS485串口光端机又叫RS485光纤MODEM,实现双向RS485信号转换成光信号通过光纤传输,光纤接口采用SC/FC/ST型接口,单纤或双纤接口。那么,RS485串口光端机的功能特点有哪些呢?接下来我们就跟随飞畅科技的小编一起来详细了解…

NB-IoT在智能农业中的示范应用

一、 概述 传统农业,种植过程无非是播种、施肥、浇水、收割,种植者也基本全凭感觉经验,往往都是肉眼判断土壤表面干了或者农作物生长出状况才开始进行浇水施肥,遭到虫害才开始打药,对于农作物的生长周期都是很模糊的。…

基于GPRS、NB-IOT、LTE的自组网方案

一、概述 成都亿佰特电子科技有限公司是一家致力于自主研发和客户定制需求的创新型公司,成都亿佰特针对GPRS、NB-IOT、LTE推出了RS232、R485接口的E840-DTU系列数传电台。 针对目前GPRS、NB-IOT、LTE三种不同的技术形式和市场需求,成都亿佰特已经建立了…

rs-485光端机的使用你真的清楚吗?

485光端机,主要的功能就是实现传输rs485信号的,但是在使用过程中,我们经常会遇到各种问题现,接下来就由飞畅科技的小编来为大家讲解几种485光端机主要问题及解决方法,一起来看看吧!   1、常规的使用方式…

4G通信的网络结构与技术分析

1、4G通信网络的关键技术 研究4G通信网络,就必须加强对其关键技术的研究,这是决定4G网络通信与3G网络通信不同的关键因素,其主要包括正交频分复用技术、软件无线电技术、智能天线技术、多输入多输出技术、IP核心网技术和多用户检测技术等。 …

在线学习Java编程的最佳方法

1.简介 Java是使用最广泛的编程语言之一。 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言。 掌握Java的人有很多话题。 好消息是,您可以在线找到很多内容。 在这篇文章中,我们将对所有这些主题进行分类&#x…

基于SpringBoot的个人健康管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

LoRa是怎样实现定位的

1.简介 物联网应用对定位的要求越来越多,尤其是一些资产跟踪等的应用。根据Machina Research研究,到2020年底,物联网将会有超过15亿台连接设备。其中约三分之一将严重依赖地理数据,60%应用将可能包括地理数据。Semtec…

RS-485中继器的多种使用方法

RS-485中继器是带有光电隔离和防雷保护的通信产品,能起到延长RS-485/422的通信距离放大信号的作用,也能增强485/422总线的负载能力。本身带有隔离和防雷模块,能保证产品的通信更稳定。 RS-485/422总线如果在恶劣的环境中使用,从…

10835k1_行政组织学_21秋考试

1、我们一般称( )为”科学管理之父“。(2 分) A.法约尔 B.弗兰克・古德诺 C.弗雷德里克・W・泰勒 D.韦伯 2、( )的独特优势之一是能够为不同的组织和个人提供…

工业控制中无线局域网应用前景分析

一、概述 无线局域网是指无线通信技术与上位机设备互相连接,最初推出的版本为IEEE802.11和IEEE802.11b,虽然传输距离和蓝牙一样,属于短距离传输,但是其传输速率最高可以达到11Mb/s,并且其覆盖率也相当高。目前WIFI技术…

10853k1_领导学基础_21秋考试

1、美国普林斯顿大学的鲍莫尔认为,一个领导者应该具备( )项基本特质。(2 分) A.8 B.7 C.10 D.9 2、领导绩效评估是领导活动发展的( )。&#xff0…