java8 函数式编程_Java 8函数式编程:延迟实例化

java8 函数式编程

单例通常会延迟实例化自己,有时,如果对象足够重,则可以延迟实例化类字段。

通常,在走惰性路线时,getter方法(或accessor )必须具有一段代码,该代码块在返回对象之前检查是否已实例化该对象(如果不是,则需要实例化)。 一旦实例化了对象,该检查就没有意义。 它只会减慢已(通常)使用同步或锁定进行阻塞的方法的速度。 让我们看一下删除该代码的方法,对吗?

免责声明

我没有想到这个。 我是从Venkat Subramaniam的Java函数编程中获得的。 我强烈推荐这本书和作者。 Venkat所阅读的所有内容都做得很好,而且易于学习。

它是如何工作的?

基本思想是:

  1. 将延迟实例化的字段替换为所需类型的供应商。
  2. 供应商实例化该对象(但尚未返回它)
  3. 然后将字段设置为新的Supplier,该供应商仅返回实例化的对象
  4. 返回实例

因此,让我们看看实际情况。 我们将有一个名为Holder的类,该类要延迟实例化Heavy类型的对象。 此代码直接从Venkat的书中编译而成:

public class Holder
{private Supplier heavy = () -> createAndCacheHeavy();public Heavy getHeavy(){return heavy.get();}private synchronized Heavy createAndCacheHeavy(){class HeavyFactory implements Supplier{private final Heavy heavyInstance = new Heavy();public Heavy get(){return heavyInstance;}}if(!HeavyFactory.class.isInstance(heavy)){heavy = new HeavyFactory();}return heavy.get();}
}

现在,此代码可以正常工作,但是我发现createAndCacheHeavy的实现不必要地令人困惑。 第一次看到此代码时,我花了很长时间才弄清楚它在做什么。

因此,让我们对其进行一些修改,对吧? 我们将使它看起来像是按照我之前列出的步骤进行操作。

private Heavy createAndCacheHeavy()
{Heavy instance = new Heavy();heavy = () -> instance;return instance;
}

那不是更好吗? 我认为,这比以前更简单,更干净。 而且仍然有效! 好吧,这里有一个小警告:为了使代码具有线程安全性,您需要同步getInstance()方法而不是createAndCacheHeavy方法。 与Venkat的代码相比,这种更改会使代码的速度稍慢一些,因为一旦HeavyFactory到位,他的代码就不会使用同步。 但是它仍然比每次都需要同步和有条件检查的旧方法要快。

因此,这是一些有用的代码,但是您是否想在每次懒惰地实例化某些东西时都键入该代码? 我不这么认为。 因此,让我们创建一个可重用的类,使我们的生活更加轻松。

但是首先,只是为了向您展示它变得更容易使用,让我向您展示它的使用情况。

Supplier<Heavy> heavy = LazilyInstantiate.using(() -> new Heavy());

而已! 让我们更仔细地看一下它,并深入研究它,然后再进行研究。

该行的声明位与以前相同; 一家名为Heavy的重型供应商。 但是随后我们调用了LazilyInstantiate的静态方法,该方法原来是返回工厂实现Supplier的LazilyInstantiate对象的静态工厂方法。 传递给该方法的参数是在那里的“重型供应商”,因此用户可以为实例化器提供正确的代码以实例化对象。

那么,您是否对它的工作方式感到好奇? 好,这是LazilyInstantiate的代码:

public class LazilyInstantiate implements Supplier
{public static  LazilyInstantiate using(Supplier supplier){return new LazilyInstantiate<>(supplier);}public synchronized T get(){return current.get();}private LazilyInstantiate(Supplier supplier){this.supplier = supplier;this.current = () -> swapper();}private final Supplier supplier;private Supplier current;private T swapper(){T obj = supplier.get();current = () -> obj;return obj;}
}

您可能会发现我的方法的顺序与通常的方法有所不同。 我更喜欢先拥有公共的东西,然后拥有私有的和受保护的包裹,然后拥有私有的东西。 在这些块中,我执行静态字段,然后构造函数,然后是静态方法,然后是普通字段,然后是普通方法。 通常,这似乎按照用户阅读我的代码的最重要程度至最不重要的顺序对事物进行了排序。

您可以随意将代码复制到任何地方,也可以在github上查看我的Functional-java库 ,该库具有此类的完整文档版本(func.java.lazy.LazilyInstantiate)和许多其他有用的函数类。

翻译自: https://www.javacodegeeks.com/2015/01/java-8-functional-programming-lazy-instantiation.html

java8 函数式编程

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

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

相关文章

linux数组操作 增删改查,linuxea:go数组与数组增删改查(19)

复合数据类型是集合类&#xff0c;并且可以存储多个单值。在golang中存储的数组是相同的数据类型&#xff0c;并且长度也是其中的一个属性。在go中&#xff0c;数组的长度一旦定义&#xff0c;就不可变。如果声明了长度的变量&#xff0c;只能赋值相同的长度的数组数组是具有相…

C语言的特点与创建的基本步骤是什么

C语言的特点与创建的基本步骤是&#xff1a;C 语言特点&#xff1a;1.C语言是一种成功的系统描述语言&#xff0c;用C语言开发的UNIX操作系统就是一个成功的范例;2.同时C语言又是一种通用的程序设计语言&#xff0c;在国际上广泛流行。世界上很多著名的计算公司都成功的开发了不…

谷歌guava_Google Guava:您永远不会知道的5件事

谷歌guava每个开发人员可以使用哪些鲜为人知的Google Guava功能&#xff1f; 它是那里最受欢迎的库之一&#xff0c;它是开源的&#xff0c;您可能已经知道了&#xff0c;它来自人们玩Quidditch作为一项真正的运动的地方&#xff08;至少在The Internship上 &#xff09;。 它…

c语言中prime的作用,C语言判断素数prime

《C语言判断素数prime》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言判断素数prime(2页珍藏版)》请在人人文库网上搜索。1、主函数&#xff1a;#include int prime();void main()int number;int flag;printf (请输入一个大于1的整数:);scanf (%d,&number)…

C语言strcmp函数用法

C语言strcmp函数用法strcmp函数语法为“int strcmp(char *str1,char *str2)”&#xff0c;其作用是比较字符串str1和str2是否相同&#xff0c;如果相同则返回0&#xff0c;如果不同&#xff0c;前者大于后者则返回1&#xff0c;否则返回-1。简单示例&#xff1a;char a[]"…

Linux C 服务器端这条线怎么走?

在校学生的编程语言和数据结构的基础还不错&#xff0c;我认为应该在《操作系统》和《计算机体系结构》这两门课上下功夫&#xff0c;然后才去读编程方面的 APUE、UNP 等书。下面简单谈谈我对学习这两门课的看法和建议&#xff0c;都是站在服务端程序员的角度&#xff0c;从实用…

tp3 默认模块 默认方法_您需要了解的有关默认方法的所有信息

tp3 默认模块 默认方法因此&#xff0c;默认方法是……昨天的新闻&#xff0c;对不对&#xff1f; 是的&#xff0c;但是使用了一年之后&#xff0c;积累了很多事实&#xff0c;我想将这些事实收集在一个地方&#xff0c;供刚开始使用它们的开发人员使用。 甚至有经验的人都可以…

熟悉c语言,实验一 熟悉C语言的运行环境

《实验一 熟悉C语言的运行环境》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《实验一 熟悉C语言的运行环境(8页珍藏版)》请在人人文库网上搜索。1、实验一 熟悉C语言的运行环境一、 实验目的1. 熟悉C语言运行环境。2. 掌握语言程序的书写格式和语言程序的结构。3. 掌…

存储过程 锁定并发_Java并发教程–锁定:显式锁定

存储过程 锁定并发1.简介 在许多情况下&#xff0c;使用隐式锁定就足够了。 有时&#xff0c;我们将需要更复杂的功能。 在这种情况下&#xff0c; java.util.concurrent.locks包为我们提供了锁定对象。 当涉及到内存同步时&#xff0c;这些锁的内部机制与隐式锁相同。 区别在于…

C语言 PK 各大编程语言

今天分享一篇关于C语言为何如此有魅力的文章&#xff0c;如果你还在学习哪门语言的路口抉择&#xff0c;建议可以认真看看~以下为CSDN译文&#xff1a;没有什么技术可以应用长达50年之久&#xff0c;除非它真的比大多数其他东西都要好用——对于一种计算机行业的技术来说尤其如…

c语言线性表拷贝,数据结构(C语言版)---线性表顺序存储表示

1、顺序表&#xff1a;线性表的顺序存储&#xff0c;用一组地址连续的存储单元存储线性表中的数据元素。1) 特点&#xff1a;随机访问&#xff0c;即通过首地址和元素序号可在时间O(1)内找到指定元素。表中元素的逻辑顺序与其物理顺序相同&#xff0c;线性表中元素的位序是从1开…

nifty ui_Nifty JUnit:在方法和类级别上使用规则

nifty ui如Nifty JUnit&#xff1a;使用临时文件一文中所示 &#xff0c;可以在JUnit测试中使用Rule &#xff0c;这是方法级别的规则。 在此示例中&#xff0c;我想显示ClassRule用于类级别规则的变体。 方法规则 Rule在测试类的每个测试方法&#xff08;就像Before &#xf…

在switch语句中,case后的标号只能是什么?

switch语句用于基于不同条件执行不同动作。语法格式&#xff1a;switch (变量表达式){case 常量1: 语句;break;case 常量2: 语句;break;case 常量3: 语句;break;...case 常量n: 语句;break;default: 语句;break;}switch语句是一个条件选择语句&#xff0c;找到相同的…

android+动画+锯齿,Android当中的防锯齿(Bitmap Canvas )

在Android中&#xff0c;目前&#xff0c;我知道有两种出现锯齿的情况。① 当我们用Canvas绘制位图的时候&#xff0c;如果对位图进行了选择&#xff0c;则位图会出现锯齿。② 在用View的RotateAnimation做动画时候&#xff0c;如果View当中包含有大量的图形&#xff0c;也会出…

osgi:install_OSGi服务测试助手:ServiceRegistrationRule

osgi:installOSGi服务测试可以是避免与悬挂的服务引用有关的问题的有效方法。 就像我在写简单服务贡献验证中所承诺的那样&#xff0c;这次我引入了一个JUnit规则 &#xff0c;该规则有助于测试组件之间的交互。 OSGi服务测试组件交互 假设我们有一个服务&#xff0c;该服务通…

C语言——结构体链表,附完整示例

引用自身的结构体&#xff0c;一个结构体中有一个或多个成员的基类型就是本结构体类型时&#xff0c;说明这个结构体可以引用自己&#xff0c;所以称作引用自身的结构体。例如下面的结构体&#xff1a;struct link{ char ch; struct link *p} a;p是一个可以指向struct link类型…

android 注解点击事件,android click事件注解

定义注解&#xff1a;package com.fyfeng.android.annotations;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;Retention(value RetentionPolicy.RUNTIME…

jax-rs jax-ws_快速浏览JAX-RS请求与方法匹配

jax-rs jax-ws在本文中&#xff0c;我们来看一下JAX-RS中与资源方法匹配的HTTP请求 。 它是JAX-RS的最基本功能之一。 通常&#xff0c;使用JAX-RS API的开发人员不会接触&#xff08;或真正不需要知道&#xff09; 匹配过程的细节&#xff0c;请放心&#xff0c;由于我们的RES…

C语言知识总结——宏,枚举

1、define宏定义以#号开头的都是编译预处理指令&#xff0c;它们不是C语言的成分&#xff0c;但是C程序离不开它们&#xff0c;#define用来定义一个宏&#xff0c;程序在预处理阶段将用define定义的来内容进行了替换。因此在程序运行时&#xff0c;常量表中并没有用define定义的…

C语言知识总结——共用体

union 共用体&#xff08;联合体&#xff09;在进行某些算法的C语言编程的时候&#xff0c;需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术&#xff0c;几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构&#xff0c;在C语言中 以关键字union…