惰性函数|学习笔记

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 快速学习惰性函数。

开发者学堂课程【Scala 核心编程-基础惰性函数】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/8937


惰性函数

 

内容介绍

一、含义

二、大数据推荐系统

三、惰性函数的由来

四、总结

 

一、含义

惰性函数听其名而知其,首先它是一个函数,第二它是一个惰性函数。为什么要有惰性函数?将来做大数据处理要处理很多数据,但是有可能处理完了之后,用户不用

在阿贾克斯技术还没有出现的时候所有的门户网站是打开首页面,把整个页面全部加载。一个首页面的内容很多,但实际上用户打开首页面以后,可能就看了暂时显示的页面,后面加载的就浪费了。这种场景在大数据计算里面也有可能是出现的。惰性计算的一种优化延迟表达式的求值。

延迟表达式就是许多函数式编程语言的特性。惰性集合在需要时提供其他元素,无需预先计算。这样就带来一些好处首先可以将耗时的计算推迟到绝对需要时再去计算。

habit 的时候就有一个延时加载,是需要在进行页面渲染的时候它才去数据库查询这个程序。就类似于这推迟到绝对需要时才计算。这样就可以创造无限多个集合,只要继续接收请求,就会继续提供元素。函数的惰性能够得到更高效的代码。

java 没有惰性,没有提供惰性的原生支持,但 Scala 直接提供了,这个就叫惰性函数。

 

二、大数据推荐系统

1.大数据生态体系:

image.png

它主要完成了最主要的核心功能,就是完成三个功能。一个就是对数据的采集,kafka 就是在这里出现的。第二个就是对大数据的存储。第三个就是对大数据的计算。

大数据主要解决三个问题,最麻烦的是当采集到很多数据的时候,要马上计算。如果把数据马上计算出来,把它放到这个业务层入库了但是别人不用所以这边就出现一个在计算和存储之间能不能做一个缓冲的问题。先把数据存到对方如果真的要计算,再调用 spark 进行实时计算,最后把这个结果用 javaEE 的技术展现给用户。这就是一个优化

2.案例说明

image.png

京东准备做一个推荐系统。这儿有很多用户,这个用户在京东网站上买了很多的产品,买了很多产品就形成日志。日志有了后就用相应的技术进行采集。按理说采集完了过后就会发给 spark 进行一个实时计算。然后把结果推给javaEE 最后入库,或者是到文件最后用 javaEE 技术提供给用户就看到相应的推荐的产品了。

比如买了一双鞋子。买完之后它的下面就会展现出还可以购买其他的商品。但这种应用是实时的,有些应用场景这样做不合理,因为这个数据量会非常大。可以先把它缓冲到这个地方去,等到用户真的要用其中一个结果时,马上调用去进行计算。这个就是惰性函数的一个由来。

 

三、惰性函数的由来

1.核心代码:

Java 没有原生态的懒加载机制,它一般是通过自己的函数来实现。比如学 java 的时候,一定学过单模式的懒汉式。还有一个叫饿汉懒汉式核心代码大致就是:

if(property==null){

property=initProperty();

}

return property;

去加载一个类的时候,这个类并没有去真正的构建这个单位对象。比如调用 get property 时,如果为空,再去初始化对象这个就是它核心的代码,这是 java 要自己去实现懒加载。

当函数返回值被声明为 lazy 时函数的执行将会被推迟,直到首次取或者是用这个返回值,该函数才会真正的执行。这个函数称之为惰性函数。

2.懒加载:

java 将这些框架代码称作为懒加载。新建一个包叫做 lazyDemo01

Object LazyDemo01{

def main(args: Array[String]):Unit = {

Lazy val res = sum(10,20)

println(---------)

println(res=+res)  //在要使用 res 前才执行

}

//sum 函数,返回和

def sum (n1:Int,n2:Int):int={

println(sum()执行了..)//输出一句话

return  n1+n2

}

}

3.注意

(1)lazy 不能修饰 var 类型的变量

(2)不但是调用函数时加了 lazy 会导致函数的执行被推迟,在声明一个变量时如果声明了 lazy 那么变量值的分配也会推迟。比如 lazy var i=10。

数据计算出什么时候用?根据业务逻辑,希望有大量的计算。但是这个计算根据你的业务逻辑判断,可能并不是实时,马上就要把这个结果给他推过去。而是在用户使用的时候,在临时的基础上是可以的。而且 spark 的本身的特点就是它是内存级的计算框架,它本身计算速度就很快。即使刚刚加载进去也是秒级反应,所以没有必要非得把一大堆数据的结果都先入库

将来的应用场景是如果有一个大数据的计算,但是你希望延迟到当用户调用时间去计算的时候把函数给加一个性能就会大大提升。

加一个 lazy 起这么大的效果其实有时候优化就是那么

一个数据通道,类似于 QQ 服务器,那个服务器要支撑1000万人同时在线,目标并不大,但是要求只能在普通PC服务器上里面核心最耗费资源的是保存和查询用户在线状态这个功能。两个人聊天,比如 QQ 聊天的时候,要知道这个人有没有在线,有没有离线他的IP在什么地方,要发一个 hello  怎么给他传过去其中有一个最核心的就是必须要在服务器拿到这个人的在线动态。那么客户端是每隔5秒或者10秒会向服务器报告他的状态不报告服务器是不知道在线还是离线的。手机为什么有辐射?因为它每隔一定时间会向离它最近的这个基站发一个信息到云南去,为什么打电话那边就能通因为中国移动、中国联通有个服务器中心,每个手机或者客户端走了过后,他会向最近的那个基站报告。 

因为大家都走服务器,将来写即时通讯软件也是一个道理。其中最耗费资源的就是怎么知道这个人在线。比如 A 好友有100个用户在线,那么一百个好友在线状态要实时更新,每一个用户每隔5秒报告状态,直接写在 mysql 数据库里。优化其实没有那么难。包括以后大数据的优化,可能就是一个小技巧。

 

四、总结

1.惰性计算

惰性计算(尽可能延迟表达式求值)是许多函数式编程语言的特性。惰性集合在需要时提供其元素,无需预先计算它们,这带来了一些好处。首先,您可以将耗时的计算推迟到绝对需要的时候。其次,您可以创造无限个集合,只要它们继续收到请求,就会继续提供元素。函数的情性使用让您能够得到更高效的代码。Java 并没有为情性提供原生支持,Scala 提供了。

2.大数据推荐系统

image.png

3.Java 实现懒加载的代码

public class LazyDemo {

private String property;//属性也可能是一个数据库连接,文件等资源

public String getProperty() {

if(property== null){//如果没有初始化过,那么进行初始化 property = initProperty();

}

return property;

}

private String initProperty() {

return"property";

}

}//比如常用的单例模式懒汉式实现时就使用了上面类似的思路实现

4.惰性函数

(1)介绍

当函数返回值被声明为 lazy 时,函数的执行将被推迟,直到首次对此取值,该函数才会执行。这种函数称之为惰性函数,在 Java 的某些框架代码中称之为懒加载(延迟加载)。

(2)案例演示

def main(args: Array[String]): Unit ={

lazy val res = sum(10, 20)

println(" -------")

println("res="+ res)//在要使用 res 前,才执行

def sum(n1Int, n2 : Int): Int ={

printIn("sum() 执行了..")

return n1 + n2

}

(3)注意事项和细节

lazy 不能修饰 var 类型的变量

不但是在调用函数时,加了 lazy,会导致函数的执行被推迟,在声明一个变量时,如果给声明了 lazy,那么变量值分配也会推迟。 比如lazy val i= 10

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
12月前
|
Python
Python函数的参数学习
Python函数的参数学习
53 0
|
4月前
|
存储 前端开发 Java
理解编程语言的严格和惰性计算
【7月更文挑战第13天】本文介绍惰性计算推迟了表达式求值,直到其值真正需要时才执行,从而优化性能,节省资源。在前端和并发编程中,懒加载和类似技术结合函数式编程特性,如 continuations,平衡了抽象与性能。
62 4
理解编程语言的严格和惰性计算
|
3月前
|
存储 分布式计算 监控
|
6月前
C进阶:内存操作函数
C进阶:内存操作函数
C进阶:内存操作函数
|
存储 前端开发 JavaScript
听君一席话,如听一席话,解释解释“惰性求值”~
我们习惯将代码编写为 一系列的命令,程序会按照它们的 顺序 进行执行:
|
JavaScript 前端开发 C++
你觉得“惰性求值”在 JS 中会怎么实现?
JS 不像 Haskell,其自身从语言设计层面不支持惰性求值,但是可以通过语法去 模拟实现 这一特性; 想一想,我们可以用什么来 JS 语法来模拟这一“延迟计算”的特性?
|
JavaScript 前端开发 中间件
一文彻底搞懂迭代器与生成器函数
参考mdn上解释,迭代器是一个对象,每次调用next方法返回一个{done: false, value: ''},每次调用next返回当前值,直至最后一次调用时返回 {value:undefined,done: true}时结束,无论后面调用next方法都只会返回{value: undefined,done:true}
162 0
一文彻底搞懂迭代器与生成器函数
|
机器学习/深度学习 Java 大数据
函数递归调用的机制|学习笔记
快速学习函数递归调用的机制。
119 0
函数递归调用的机制|学习笔记
简单手写async函数,让生成器函数自动执行
简单手写async函数,让生成器函数自动执行
199 0
Lodash学习之集合调用函数处理
Lodash学习之集合调用函数处理
94 0
Lodash学习之集合调用函数处理