为了账号安全,请及时绑定邮箱和手机立即绑定
1.8 escape

控制 HTML 转义,替换 value 中的某些 HTML 特殊字符。< is converted to &lt;> is converted to &gt;' (single quote) is converted to &#39;" (double quote) is converted to &quto;& is converted to &amp;{% autoescape off %} {{ title|escape }}{% endautoescape %}

3.4 逻辑运算

利用 test 命令可以进行逻辑判断,以下介绍 Shell 的逻辑运算符,假定变量 A 为 1,变量 b 为 2:如果需要在一个 test 中执行多个判断,需要使用 [[]], test 是 Shell 内置关键字,不是命令,免除函数传递过程,因此更加建议使用 [[]]。双中括号有以下注意事项:不需要把变量名用双引号 "" 包围起来,即使变量是空值,也不会出错;不需要、也不能对 >、< 进行转义,转义后会出错;其支持正则表达式,组合逻辑可以不使用 test 的 - a,-o 而使用 && ||。与逻辑运算符号对应的 && 可以使用 -a,|| 可以使用 -o 来替换。运算符说明举例&&逻辑的 AND[[ $A -lt 10 && $B -gt 100 ]] 返回 false||逻辑的 OR[[ $A -lt 10 || $B -gt 100 ]] 返回 true例如:#!/bin/bashnum1=1num2=2echo "num1 为:${num1}"echo "num2 为:${num2}"if [[ $num1 -lt 5 && $num2 -gt 5 ]];then echo "返回 true"else echo "返回 false"fiif [[ $num1 -lt 5 || $num2 -gt 5 ]];then echo "返回 true"else echo "返回 false"fiif [ $num1 -lt 5 ] && [ $num2 -gt 5 ];then echo "返回 true"else echo "返回 false"fiif [ $num1 -lt 5 ] || [ $num2 -gt 5 ];then echo "返回 true"else echo "返回 false"fiif [ $num1 -lt 5 -a $num2 -gt 5 ];then echo "返回 true"else echo "返回 false"fiif [ $num1 -lt 5 -o $num2 -gt 5 ];then echo "返回 true"else echo "返回 false"fi返回:num1 为:1num2 为:2返回 false返回 true返回 false返回 true返回 false返回 true

4.2 默认分配 - 堆内存 &amp; 直接内存

实例:ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(10);源码:以下源码是经过处理,只保留核心部分。public abstract class AbstractByteBufAllocator implements ByteBufAllocator { private final boolean directByDefault; //构造函数 protected AbstractByteBufAllocator(boolean preferDirect) { this.directByDefault = preferDirect && PlatformDependent.hasUnsafe(); } public ByteBuf buffer(int initialCapacity) { return this.directByDefault ? this.directBuffer(initialCapacity) : this.heapBuffer(initialCapacity); }}通过 directByDefault 来判断是否选择创建堆内存还是直接内存的 ByteBuf,而 directByDefault 是在构造函数里面进行传值的,那么它是一个抽象类,因此肯定是从其子类的构造函数传值进来。继续查看源码:public class PooledByteBufAllocator extends AbstractByteBufAllocator { public PooledByteBufAllocator() { //传递的是false this(false); }}public final class UnpooledByteBufAllocator extends AbstractByteBufAllocator { public UnpooledByteBufAllocator(boolean preferDirect) { this(preferDirect, false); } public UnpooledByteBufAllocator(boolean preferDirect, boolean disableLeakDetector) { //传递值给父类的构造函数 super(preferDirect); this.disableLeakDetector = disableLeakDetector; }}总结,ByteBufAllocator 的核心两个步骤分别如下:确定是使用哪个分配器,池化还是非池化?UnpooledByteBufAllocator 和 PooledByteBufAllocator;再确定是堆内存还是直接内存,主要是在 UnpooledByteBufAllocator 和 PooledByteBufAllocator 的构造函数里面传值确定。

getter &amp; setter

利用 getter/setter 可以拦截操作对象的属性,在设置属性前或获取属性前做一些事情。

before &amp;&amp; after

这两个伪类元素功能很相似,都是在元素内部插入新的内容。下面一起看下他们的区别和用法。

3. Go 语言的逻辑运算符

Go语言中的逻辑运算符如表所示:运算符结合性描述&&从左到右左右实体均为 true 运算结果为 true ,否则为 false||从左到右左右实体均为 false 运算结果为 false ,否则为 true!从右到左右边实体为 false 运算结果为 true ,否则为 false代码示例:package mainimport ( "fmt")func main() { var a = true var b = false fmt.Println("a && b :", a && b) fmt.Println("a || b :", a || b) fmt.Println(" !a :", !a)}运算结果:

1. 案例演示

Tips:示例程序在 GCC 7.5.0 下测试通过,请大家使用支持 C99 标准的编译器。# include <stdio.h># include <stdbool.h>int main(){ bool x,y,z; x=false; y=true; printf("x = %d; y = %d\n",x,y); z=x||y; printf("x || y = %d\n",z); z=x&&y; printf("x && y = %d\n",z); printf("!x = %d\n",!x); printf("!y = %d\n",!y); return 0;}运行结果x = 0; y = 1x || y = 1x && y = 0!x = 1!y = 0从实际的程序可以看到,和我们上一节中介绍的表格中的运算结果是一致的。如果不使用布尔类型,直接使用整数会怎样?下面我就通过实际的程序来看一下结果。# include <stdio.h>int main(){ int x,y,z; x=0; y=10; printf("x = %d; y = %d\n",x,y); z=x||y; printf("x || y = %d\n",z); z=x&&y; printf("x && y = %d\n",z); printf("!x = %d\n",!x); printf("!y = %d\n",!y); return 0;}运行结果x = 0; y = 10x || y = 1x && y = 0!x = 1!y = 0虽然由布尔类型变为了整数类型,但是最后的结果是一致的。这也就是 C 语言在出现布尔类型之前经常用到的形式。

2.3 字符串转义

在处理 URL 或 HTML 表单数据中的参数时,需要指定转义特殊字符,例如:引号(“),斜杠(/)。Ruby CGI 对象提供CGI.escape 、CGI.unescape和方法来转义这些特殊字符:escape 的例子:#!/usr/bin/rubyrequire 'cgi'puts CGI.escape(Zara Ali/A Sweet & Sour Girl")# ---- 输出结果 ----Zara+Ali%2FA+Sweet+%26+Sour+Girl另一组示例:#!/usr/bin/rubyrequire 'cgi'puts CGI.escapeHTML('<h1>Zara Ali/A Sweet & Sour Girl</h1>')# ---- 输出结果 ----&lt;h1&gt;Zara Ali/A Sweet &amp; Sour Girl&lt;/h1&gt;CGI 还有许多的方法,详细可以通过点击这里查看。

2.5 从 HttpRequest 中获取参数

从 HttpRequest 中获取参数是我们进行 Web 开发中最常用的一种方式。对于 Django 的视图函数来说,HTTP 请求的数据被 HttpRequest 实例化后传到了视图函数的第一个参数中。为了能观察相关信息,我们修改请求的视图函数:@csrf_exemptdef hello_view(request, *args, **kwargs): # 在第三次使用表单上传包括文件数据时,需要request.GET和request.POST操作,不然会抛异常 params = "request.GET={}\n".format(request.GET) params += "request.POST={}\n".format(request.POST) params += "request.body={}\n".format(request.body) params += "request.FILES={}\n".format(request.FILES) return HttpResponse(params)我们测试如下 3 种 HTTP 请求,分别为 GET 请求、POST 请求 和带文件参数的请求,结果如下:[root@server ~]# curl -XGET "http://127.0.0.1:8881/hello/world/?a=xxxx&b=yyyy" request.GET=<QueryDict: {'a': ['xxxx'], 'b': ['yyyy']}>request.POST=<QueryDict: {}>request.body=b''request.FILES=<MultiValueDict: {}>[root@server ~]# curl -XPOST -d "username=shen&password=shentong" "http://127.0.0.1:8881/hello/world/?a=xxxx&b=yyyy" request.GET=<QueryDict: {'a': ['xxxx'], 'b': ['yyyy']}>request.POST=<QueryDict: {'username': ['shen'], 'password': ['shentong']}>request.body=b'username=shen&password=shentong'request.FILES=<MultiValueDict: {}># 本次请求中,需要去掉request.GET和request.POST操作语句,不然请求会报错[root@server ~]# curl -XPOST -F "username=shen&password=shentong" "http://127.0.0.1:8881/hello/world/?a=xxxx&b=yyyy" -F "files=@/root/upload_file.txt"request.body=b'------------------------------68c9ede00e93\r\nContent-Disposition: form-data; name="username"\r\n\r\nshen&password=shentong\r\n------------------------------68c9ede00e93\r\nContent-Disposition: form-data; name="files"; filename="upload_file.txt"\r\nContent-Type: text/plain\r\n\r\nupload file test\n\r\n------------------------------68c9ede00e93--\r\n'request.FILES=<MultiValueDict: {'files': [<InMemoryUploadedFile: upload_file.txt (text/plain)>]}>可以看到,跟在 “?” 后的参数数据会保存到 request.GET 中,这也是 GET 请求带参数的方式。对于 POST 请求的传参,数据一般会保存在 request.POST 和 request.body 中。对于最后发送的上传文件请求,可以看到,文件内容的内容数据是保存到了 request.body 中。

3.3 实现

实现脚本#!/bin/bash# Description: count file scripts# Auth: kaliarch# Email: kaliarch@163.com# function: count file# Date: 2020-03-29 14:00# Version: 1.0[ $(id -u) -gt 0 ] && exit 1# cpu使用超过百分之多少进行限制PEC_CPU=80# 限制进程使用百分之多少,如果程序为多线程,单个cpu限制为85,如果为多核心,就需要按照比例写,例如cpu为2c,像限制多线程占比80%,就写170LIMIT_CPU=85# 日志LOG_DIR=/var/log/cpulimit/# 超过阀值进程pidPIDARG=$(ps -aux |awk -v CPU=${PEC_CPU} '{if($3 > CPU) print $2}')# 安装cpulimit 函数install_cpulimit() { [ ! -d /tmp ] && mkdir /tmp || cd /tmp wget -c https://github.com/opsengine/cpulimit/archive/v0.2.tar.gz tar -zxf v0.2.tar.gz cd cpulimit-0.2 && make [ $? -eq 0 ] && cp src/cpulimit /usr/bin/}# 执行cpulimitdo_cpulimit() {[ ! -d ${LOG_DIR} ] && mkdir -p ${LOG_DIR}for i in ${PIDARG};do CPULIMITCMD=$(which cpulimit) MSG=$(ps -aux |awk -v pid=$i '{if($2 == pid) print $0}') echo ${MSG} [ ! -d /tmp ] && mkdir /tmp || cd /tmp nohup ${CPULIMITCMD} -p $i -l ${LIMIT_CPU} & echo "$(date) -- ${MSG}" >> ${LOG_DIR}$(date +%F).logdone}# 主函数main() { hash cpulimit if [ $? -eq 0 ];then # 调用函数 do_cpulimit else install_cpulimit && do_cpulimit fi}main测试需编写 CPU 压力测试 python 脚本,后期可以放入计划任务来监控并限制 CPU 使用率。#!/bin/env pythonimport mathimport randoma=10000b=10000c=10000sum=0for i in range(0,a): for j in range(0,b): randomfloat=random.uniform(1,10) randompow=random.uniform(1,10) sum+=math.pow(randomfloat, randompow)print "sum is %s" % sum当我们执行 python 的 CPU 压力测试脚本后,发现单核服务 CPU 跑到了 100%。之后运行我们的 CPU 限制脚本,可以看到 CPU 被成功限制。在此案例中,我们着重来看 Shell 函数,在实例中我们编写了安装与执行 CPU 限制两个函数,最后编写主函数,在主函数中调用其他函数,配合定时任务就能达到限制某进程的 CPU。

3. 逻辑运算符

运算符作用示例&&逻辑与a&&b||逻辑或a||b!逻辑非!a

3. 一些拓展函数

下面是一些常用的类型判断函数:const isNumber = (val: unknown): val is number => typeof val === 'number'const isString = (val: unknown): val is string => typeof val === 'string'const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol'const isFunction = (val: unknown): val is Function => typeof val === 'function'const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object'function isPromise<T = any>(val: unknown): val is Promise<T> { return isObject(val) && isFunction(val.then) && isFunction(val.catch)}const objectToString = Object.prototype.toStringconst toTypeString = (value: unknown): string => objectToString.call(value)const isPlainObject = (val: unknown): val is object => toTypeString(val) === '[object Object]'

4.3 实现

创建文件首先创建个文件 myvim 编写内容#!/bin/env bash# Description: /mybin/myvim scripts# Auth: kaliarch# Email: kaliarch@163.com# function: auto generate banner# Date: 2020-02-15 13:36# Version: 1.0# file not exist[ $# -eq 0 ] && echo "$0 [file],At least one parameter!" && exit 1# add banneradd_banner() {cat > $1 << EOF#!/bin/env bash# Description: $0 scripts# Auth: $USER# Date: $(date +%F" "%H:%M)# Version: 1.0EOF}# exist filefor file in $*;do if [ -f ${file} ];then vim ${file} && exit 0 else touch ${file} && add_banner ${file} && vim ${file} && exit 0 fidone添加进 PATH 中 [root@devops-server mybin]# chmod +x myvim # 添加可执行权限[root@devops-server mybin]# echo $PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin[root@devops-server mybin]# echo "export PATH=\$PATH:/mybin" >> /etc/profile # 将mybin添加进PATH中[root@devops-server mybin]# source /etc/profile[root@devops-server mybin]# echo $PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/mybin

1. 与

语法:表达式1 && 表达式2如果表达式1的结果成立则返回表达式2的结果,否则返回表达式1的结果与可以理解为且、并且、同时。与在 JavaScript 使用 && 表示。true && true; // truetrue && false; // falsefalse && true; // falsefalse && false; // false与操作在左侧的表达式结果为 true 或者可以隐式转换为true的时候,会返回右侧表达式结果,否则返回左侧表达式结果。如:判断成绩是否处于 80 到 100 之间。80 到 100 之间换一种表述方式就是,成绩大于等于 80 并且成绩小于等于100,这种表述形式更像程序语言,所以条件就是分数 >= 80 并且 分数 <= 100。var score= 67;if (score >= 80 && score <= 100) { console.log(score + '分在80到100之间');} else { console.log(score + '分不在80到100之间');}if 语句中的条件左右都不满足,所以返回了表达式 score >= 80 的结果false。如果 score 为 90,则满足两个条件,返回右侧表达式的结果。

3.3 搜索关键字向量化

有了索引后,我们如何来搜索索引了?一般情况下,我们是通过关键词来检索的,那么如何来组织关键词呢?PostgreSQL 提供了to_tsquery函数来将词组织成tsquery向量,然后通过向量去搜索。如下:SELECT to_tsquery('sql & java'); to_tsquery---------------- 'sql' & 'java'tsquery是一种特殊的数据类型,它会将关键词拼接来表示搜索条件,如&表示搜索的内容必须包含sql和java。举个复杂的例子:SELECT to_tsquery('sql & (java | python)'); to_tsquery------------------------------- 'sql' & ( 'java' | 'python' )这个例子表示,搜索的内容必须包含sql和java与python中的一种。

4.3 创建 Excel 文件上传处理方法

制器和文件上传界面方法如下: public function uploadExcel() { $data = $this->request->param(); $file_url = "./upload/" . $data['file_url']; $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file_url); $n = 2; while (true) { $name = $spreadsheet->getActiveSheet()->getCell('A' . $n)->getValue(); $age = $spreadsheet->getActiveSheet()->getCell('B' . $n)->getValue(); $id_number = $spreadsheet->getActiveSheet()->getCell('C' . $n)->getValue(); try { $studentModel = new StudentModel(); $studentModel->name = $name; $studentModel->age = $age; $studentModel->id_number = $id_number; $studentModel->created_at = time(); $studentModel->save(); } catch (\Exception $exception) { } if(empty($name) && empty($age) && empty($id_number)){ break; } $n++; } return $this->success('导入成功'); }

4.3 实现

#!/bin/bash# Description: count file scripts# Auth: kaliarch# Email: kaliarch@163.com# function: count file# Date: 2020-03-21 14:00# Version: 1.0# 判断输入至少一个参数[ $# -le 1 ] && echo "输入参数错误,至少输入一个数字" && exit 1for num in $*;do # 判断输入的都为数字且输入数字大于等于0 [ "${num}" -ge 0 ] 2>/dev/null [ $? -ne 0 ] && echo "输入的${num}不符合参数规范" && exit 1done# 对目录下的文件进行统计MIN_NUM=$1MAX_NUM=$1for num in $*;do if [ ${num} -gt ${MAX_NUM} ];then MAX_NUM=${num} elif [ ${num} -lt ${MIN_NUM} ];then MIN_NUM=${num} else echo -e "" fidoneecho "输入的参数总共为:$#"echo "输入的数字为:$*"echo "其中最大的数字为:${MAX_NUM}"echo "其中最小的数字为:${MIN_NUM}"

4.2 父选择器 (Parent Selector)

父选择器是 Sass 中一种特殊的选择器,用于嵌套选择器中,用来引用外部的选择器;通俗的讲就是,当你使用嵌套的时候,可能你会需要使用到嵌套外层的父选择器,比如为一个元素 添加伪类 (hover、active、before、after) 的时候,可以用 & 代表嵌套规则外层的父选择器,我们举个例子来更直观的感受下:a { &:hover { color:red; } &:active { color:blue; } &:before { content:''; } &:after { content:''; } span { &:hover { color:green; } }}在上面的 Sass 代码中我们编写了几个伪类,在编译的时候 & 将会被替换为嵌套外层的父选择器,有多层嵌套的话将会把父选择器一级一级的传递下去,最终转换为如下的 CSS 代码:a:hover { color: red;}a:active { color: blue;}a:before { content: "";}a:after { content: "";}a span:hover { color: green;}4.2.1 添加后缀 (Adding Suffixes)可以使用 & 向外部选择器添加后缀,举个例子看下:.box { width:100px; &-head { width:100%; &-title { color:red; } } &-body { width:100%; } &-footer { width:100%; }}上面这个例子将会转换为如下的 CSS 代码:.box { width: 100px;}.box-head { width: 100%;}.box-head-title { color: red;}.box-body { width: 100%;}.box-footer { width: 100%;}

5. 编译安装

执行如下命令将会对 nginx 源码包进行编译安装:make && make install执行结果如下图:

2.4 逻辑运算符

逻辑运算符为,以下介绍 Shell 的逻辑运算符,假定变量 A 为 1,变量 b 为 2:运算符说明举例&&逻辑的 AND[[ $A -lt 10 && $B -gt 100 ]] 返回 false||逻辑的 OR[[ $A -lt 10 || $B -gt 100 ]] 返回 true例如:#!/bin/bashnum1=1num2=2echo "num1 为:${num1}"echo "num2 为:${num2}"if [[ $num1 -lt 5 && $num2 -gt 5 ]];then echo "返回 true"else echo "返回 false"fiif [[ $num1 -lt 5 || $num2 -gt 5 ]];then echo "返回 true"else echo "返回 false"fi返回:num1 为:1num2 为:2返回 false返回 true

2. Django 中的 HttpRequest 类

上面我们初步接触到了 HttpRequest 类,现在来详细介绍下这个类及其相关属性和方法。当 URLconf 文件匹配到客户端的请求路径后,会调用对应的 FBV 或者 CBV,并将 HttpRequest 类的实例作为第一个参数传入对应的处理函数中。那么这个 HttpRequest 类有哪些常用的属性和方法呢?常用属性:HttpRequest.scheme:请求的协议,一般为 http 或者 https;HttpRequest.body:请求主体;HttpRequest.path: 所请求 URL 的完整路径,即去掉协议,主机地址和端口后的路径;HttpRequest.method:客户端 HTTP 请求方法,如 GET、POST、PUT、DELETE等;HttpRequest.GET: 返回一个 querydict 对象,该对象包含了所有的 HTTP 请求中 GET 请求的参数;HttpRequest.POST: 返回一个 querydict 对象,该对象包含了所有的 HTTP 请求中 POST 请求的参数;HttpRequest.COOKIES:返回一个包含了所有 cookies 的字典;HttpRequest.FILES:返回一个包含所有文件对象的字典。常用方法:HttpRequest.get_host():返回客户端发起请求的 IP + 端口;HttpRequest.get_port():返回客户端请求端口;HttpRequest.get_full_path():返回请求的完整路径,包括 “?” 后面所带参数;HttpRequest.get_raw_uri():返回完整的 uri 地址,包括了协议、主机和端口以及完整请求路径;HttpRequest.build_absolute_uri():通过 request 实例中的地址和变量生成绝对的 uri 地址。示例代码:# 省略了import内容def hello_world(request, *args, **kwargs): request_info = "" request_info += "request.scheme={}\n".format(request.scheme) request_info += "request.body={}\n".format(request.body) request_info += "request.path={}\n".format(request.path) request_info += "request.method={}\n".format(request.method) request_info += "request.GET={}\n".format(request.GET) request_info += "request.FILES={}\n".format(request.FILES) request_info += "request.get_host={}\n".format(request.get_host()) request_info += "request.get_port={}\n".format(request.get_port()) request_info += "request.get_full_path={}\n".format(request.get_full_path()) request_info += "request.get_raw_uri={}\n".format(request.get_raw_uri()) request_info += "request.build_absolute_uri={}\n".format(request.build_absolute_uri()) return HttpResponse(request_info, content_type="text/plain")urlpatterns = [ path('admin/', admin.site.urls), path('hello/', hello_world),]我们启动 Django 服务后,我们使用 curl 命令发送 HTTP 请求如下:# 准备一个新的文件[root@server ~]# cat upload_file.txt upload file test[root@server ~]# curl -XPOST "http://127.0.0.1:8881/hello/?a=xxx&a=yyy&b=zzz" -F 'data={"name": "join", "age": 28}' -F "file=@/root/upload_file.txt"request.scheme=httprequest.body=b'------------------------------c28860e155fe\r\nContent-Disposition: form-data; name="data"\r\n\r\n{"name": "join", "age": 28}\r\n------------------------------c28860e155fe\r\nContent-Disposition: form-data; name="file"; filename="upload_file.txt"\r\nContent-Type: text/plain\r\n\r\nupload file test\n\r\n------------------------------c28860e155fe--\r\n'request.path=/hello/request.method=POSTrequest.GET=<QueryDict: {'a': ['xxx', 'yyy'], 'b': ['zzz']}>request.FILES=<MultiValueDict: {'file': [<InMemoryUploadedFile: upload_file.txt (text/plain)>]}>request.get_host=127.0.0.1:8881request.get_port=8881request.get_full_path=/hello/?a=xxx&a=yyy&b=zzzrequest.get_raw_uri=http://127.0.0.1:8881/hello/?a=xxx&a=yyy&b=zzzrequest.build_absolute_uri=http://127.0.0.1:8881/hello/?a=xxx&a=yyy&b=zzz通过测试结果可以更容易理解 HttpRequest 类属性和方法的含义。其中,上述 curl 请求中 -F 表示带表单数据。

2.2 运算符

2.2.1 四则运算符四则运算符是理工运算中的基础,主要包含加减乘除和绝对值运算。实例 3:四则运算符号汇总。加法符号:$x+y=z$ 减法符号:$x-y=z$ 加减符号:$x \pm y=z$ 减加符号:$x \mp y=z$ 叉乘符号:$x \times y=z$ 点乘符号:$x \cdot y=z$ 星乘符号:$x \ast y=z$ 除法符号:$x \div y=z$ 斜除符号:$x/y=z$ 分式1:$\frac{x+y}{y+z}$ 分式2:${x+y} \over {y+z}$ 绝对值:$|x+y|$ 其渲染效果如下:2.2.2 逻辑运算符实例 4:逻辑运算符号汇总。等于符号:$x+y=z$ 大于符号:$x+y>z$ 小于符号:$x+y<z$ 大于等于符号:$x+y \geq z$ 小于等于符号:$x+y \leq z$ 不等于符号:$x+y \neq z$ 不大于等于符号:$x+y \ngeq z$ 不大于等于符号:$x+y \not\geq z$ 不小于等于符号:$x+y \nleq z$ 不小于等于符号:$x+y \not\leq z$ 约等于符号:$x+y \approx z$ 恒定等于符号:$x+y \equiv z$ 其渲染效果如下:2.2.3 高等运算符实例 5:高等运算符号汇总。平均数符号:$\overline{xyz}$ 开二次方符号:$\sqrt x$ 开方符号:$\sqrt[3]{x+y}$ 对数符号:$\log(x)$ 极限符号:$\lim^{x \to \infty}_{y \to 0}{\frac{x}{y}}$ 极限符号:$\displaystyle \lim^{x \to \infty}_{y \to 0}{\frac{x}{y}}$ 求和符号:$\sum^{x \to \infty}_{y \to 0}{\frac{x}{y}}$ 求和符号:$\displaystyle \sum^{x \to \infty}_{y \to 0}{\frac{x}{y}}$ 积分符号:$\int^{\infty}_{0}{xdx}$ 积分符号:$\displaystyle \int^{\infty}_{0}{xdx}$ 微分符号:`\partial`,如:$\frac{\partial x}{\partial y}$ 矩阵符号:$\left[ \begin{matrix} &1 &2 &\cdots &4 &5 &6 &\cdots &8\\ &\vdots &\ddots &\cdots &13 &14 &15 &\cdots &16\end{matrix} \right]$其渲染效果如下:

2. Number.parseInt()&amp;Number.parseFloat()

为了保持方法上的统一,把全局下的 parseInt() 和 parseFloat() 移植到 ES6 的 Number 对象上。ES6 的 Number 对象上提供的 Number.isFinite () 和 Number.isNaN () 两个函数是相同的,如何证明 Number 下的这两个方法只是移植全局的呢?可以利用 === 运算符来判断,如下实例:Number.parseInt === parseInt; // trueNumber.parseFloat === parseFloat; // true上面的代码返回的结果都为 ture 说明此两种函数和全局是一样的,没有发生变化。具体的使用方法可以参考 ES5 中的 parseInt() 和 parseFloat() 函数。// ES5的写法parseInt('12.34') // 12parseFloat('123.45#') // 123.45// ES6的写法Number.parseInt('12.34') // 12Number.parseFloat('123.45#') // 123.45将这两个全局方法移植到 Number 对象上,为了逐步减少全局性方法,使语言逐步模块化。

3.3. Future &amp; FutureTask

Future 接口定义了对任务执行结果的取消、状态查询、结果获取方法。FutureTask 是 Future 的唯一实现类,其职责是提供方便地构建带有返回结果的任务。Future 接口的核心操作有:cancel (boolean):尝试取消已经提交的任务。isCancelled ():查询任务是否在完成之前被取消了。isDone ():查询任务是否已经完成。get ():获取异步任务的执行结果(如果任务没执行完将等待)。

2.3 SocketOutputStream &amp; SocketInputStream

java.net.SocketInputStream 和 java.net.SocketOutputStream 代表了 Socket 流的读写,他们分别继承自 java.io.FileInputStream 和 java.io.FileOutputStream 类,这说明 Socket 读写包含了文件读写的特性。另外,这两个类是定义在 java.net.* 包中,并没有对外公开。

2.4 FilterInputStream &amp; FilterOutputStream

java.io.FilterInputStream 和 java.io.FilterOutputStream 分别是 java.io.InputStream 和 java.io.OutputStream 的子类,并且它们本身都是抽象类,为被过滤的流定义接口。java.io.FilterInputStream 和 java.io.FilterOutputStream 的主要作用是为基础流提供一些额外的功能,这些不同的功能都是单独的类,继承了他们的接口。例如,过滤后的流 BufferedInputStream 和BufferedOutputStream 在读写时会缓冲数据,以加快数据传输速度。

3.1 为什么需要数据类

Java 开发小伙伴相信我们对 JavaBean 都非常的熟悉,当我们要定义一个数据模型时,就需要为其中每个属性定义 getter,setter 方法。如果要进行对象值的比较,甚至还需要重写 hashcode,equals 等方法。而对于 Kotlin 有时候并不需要这么啰嗦语法模板,它会让你实现起来更加简单高效。import java.util.Objects;public class Student { private String name; private int age; private double weight; private String nickName; private String address; public Student(String name, int age, double weight, String nickName, String address) { this.name = name; this.age = age; this.weight = weight; this.nickName = nickName; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Student)) return false; Student student = (Student) o; return age == student.age && Double.compare(student.weight, weight) == 0 && name.equals(student.name) && nickName.equals(student.nickName) && address.equals(student.address); } @Override public int hashCode() { return Objects.hash(name, age, weight, nickName, address); } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", weight=" + weight + ", nickName='" + nickName + '\'' + ", address='" + address + '\'' + '}'; }}Kotlin 使用数据类实现 Student POJO 类//你没看错,子啊Java中需要86行代码,在Kotlin中实现仅仅需要一行代码即可,实际上data class数据类编译器背后做了很多处理data class Student(var name: String, var age: Int, var weight: Double, var nickName: String, var address: String)

首页上一页1234567下一页尾页
直播
查看课程详情
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号