
excel批量不连续单元格公式选中单元格,按F4加绝对值符号。绝对值符号:$,也可以选中单元格,按F4绝对引用分三种:$A1,对A列绝对引用,不限制行的改变A$1,对第一行绝对引用,不限制列的改变$A$1,对A1绝对引用,不管将公式复制到哪,都引用A1单元格。
excel统计表的三大功能
excel的三个主要功能为:电子表格功能、图表功能、数据库功能。它能够方便的制作出各种电子表格,使用公式和函数对数据进行复杂的运算;用各种图表来表示数据直观明了;利用超级链接功能,用户可以快速打开局域网或Interner上的文件,与世界上任何位置的互联网用户共享工作薄文件。
图表是指将工作表中的数据用图形表示出来。例如:将各地区每周的销售用柱形图显示出来,图表可以使数据更加有趣、吸引人、易于阅读和评价。它们也可以帮助我们分析和比较数据。
将数据从纸上存入EXCEL工作表中,这对数据的处理和管理已发生了质的变化,使数据从静态变成动态,能充分利用计算机自动、快速的进行处理。在EXCEL中不必进行编程就能对工作表中的数据进行检索、分类、排序、筛选等 *** 作,利用系统提供的函数可完成各种数据的分析。
首先请认真看看四级教程P80~P82;
接着,我的理解是,信号量是一个特殊的变量,只能对其进行等待(P(信号量))和发送(V(信号量)),任意时刻只能存在一个执行线程访问代码的临界区;正因为如此,如果有5个进程,则必须一个个进入,而后一个个释放资源(如果你认真看过计算安全队列的题目,会发现这个规则),信号量必须满足一个进程进入,即mutex>0;
如果要N个进程一一跟着进入临界区,必定阻塞。对信号量自减一(进行等待而后进入),以待其他进程进行V *** 作;此时等待的进程就是信号量的绝对值,注意是绝对值表示当前空闲资源数!也就是说,有一个进程运行,mutex减一,若初值为M,则|M-N|表示有多少进程进入就绪队列以待资源释放;题目信号量如果为2,进程有5个,P(mutex) *** 作两次而使信号量为0,此后的进程只能进入就绪队列了,但进入就绪队列完毕,P(mutex) *** 作三次,上面说过信号量自减一,此刻mutex=-3,而刚好|mutex|为就绪队列中进程数。这就是一个加减过程,|(2-5)(信号量)|=3(进程数);
如果mutex=1,进行P(mutex) *** 作了,此刻mutex=0;而后进行V(mutex) *** 作,此刻因为mutex<=0,“从等待队列中取出头一个进程P,进程P进入等待队列”;下一次信号量自减一,mutex<0,有一个进程进入等待队列,还有N-1次 *** 作,才使全部进程进入等待队列,此刻mutex=-1;还需要进行了N-1次P *** 作,总共需要N+1次才能够对N个进程 *** 作,信号量则需要减N+1-1次,为负值。
还是不明白,
可以参考linux的对信号量 *** 作的程序,观察两个或者多个教程竞争资源的情况,对比分析;
我也考四级嵌入式,祝你也考个好成绩。
ADATABASES() 将所有打开数据库的名称和路径放到内存变量数组中
ADBOBJECTS() 把当前数据库中的命名连接名、关系名、表名或sQL视图名放到一个内存变量数组中
AFIELDS() 把当前表的结构信息存放在一个数组中,并且返回表的字段数
ALIAS() 返回当前表或指定工作区衰的别名
ASESSIONS() 创建一个已存在的数据工作期ID数组
ATAGINFO() 创建一个包含索引和键表达式的名字、数量和类型信息的数组
AUSED() 将一个数据工作期中的表别名和工作区存入内存变量数组
BOF() 确定当前记录指针是否在表头
CANDIDATE() 判断索引是否为候选索引
CDX() 根据指定的索引位置编号,返回打开的复合索引(.CDX)文件名称
CPDBP() 返回一个打开表所使用的代码页
CREATEOFFLINE() 由已存在的视图创建一个游离视图
CURSORGETPROP() 返回VisualFoxPro表或临时表的当前属性设置
CURSORSETPROP() 指定VisualFoxPro表或临时表的属性设置
CURSORTOXML() 转换VisualFoxPro临时表为XML文本
CURVAL() 从磁盘上的表或远程数据源中直接返回字段值
DBC() 返回当前数据库的名称和路径
DBF() 返回指定工作区中打开的表名,或根据表别名返回表名
DBSETPROP() 给当前数据库或当前数据库中的字段、命名连接、表或视图设置一个属性
DELETED() 返回一个表明当前记录是否标有删除标记的逻辑值
DESCENDING() 是否用DESCENDING关键字创建了一个索引标识
DROPOFFLINE() 放弃对游离视图的所有修改,并把游离视图放回到数据库中
EOF() 确定记录指针位置是否超出当前表或指定表中的最后一个记录
FCOUNT() 返回衰中的字段数目
FIELD() 根据编号返回表中的字段名
FILTER() 返回SETFILTER命令中指定的表筛选表达式
FLDLIST() 对于SETmELDS命令指定的字段列表,返回其中的字段和计算结果字段表达式
FLOCK() 尝试锁定当前表或指定表
FOR() 返回一个己打开的单项索引文件或索引标识的索引筛选表达式
FOUND() 如果CONTINUE、FIND、LOCATE或SEEK命令执行成功,函数的返回值为"真"
FSIZE() 以字节为单位,返回指定字段或文件的大小
GETFLDSTATE() 返回一个数值,标明表或临时表中的字段是否已被编辑,或是否有追加的记录,或者记录的删除状态是否已更改
GETNEXTMODIFIED() 返回一个记录号,对应于缓冲表或临时表中下一个被修改的记录
HEADER() 返回当前或指定表文件的表头所占的字节数
IDXCOLLATE() 返回索引或索引标识的排序序列
INDBC() 如果指定的数据库对象在当前数据库中,则返回"真"(T)
INDEXSEEK() 在一个索引表中搜索第一次出现的某个记录
ISEXCLUSIVE() 判断一个表或数据库是以独占方式打开的
ISFLOCKED() 返回表的锁定状态
ISREADONLY() 判断是否以只读方式打开表
ISRLOCKED() 返回记录的锁定状态
KEY() 返回索引标识或索引文件的索引关键字表达式
KEYMATCH() 在索引标识或索引文件中搜索一个索引关键字
LOOKUP() 在表中搜索字段值与指定表达式匹配的第一个记录
LUPDATE() 返回一个表最近一次更新的日期
MDX() 根据指定的索引编号返回打开的.CDX复合索引文件名
MEMLINES() 返回备注字段中的行数
MLINE() 以字符串形式返回备注字段中的指定行
NDX() 返回为当前表或指定表打开的某一索引(JDX)文件的名称
ORDER() 返回当前表或指定表的主控索引文件或标识
PRIMARY() 检查索引标识,如果为主索引标识,就返回"真"(T)
RECCOUNT() 返回当前或指定表中的记录数目
RECNO() 返回当前表或指定表中的当前记录号
RECSIZE() 返回表中记录的大小(宽度)
REFRESH() 在可更新的SQL视图中刷新数据
RELATION() 返回为给定工作区中打开的表所指定的关系表达式
SEEK() 在一个已建立索引的表中搜索一个记录的第一次出现位置
SELECT() 返回当前工作区编号或未使用工作区的最大编号
SETFLDSTATE() 为表或临时表中的字段或记录指定字段状态值或删除状态值
SQLCANCEL() 请求取消一条正在执行的SQL语句
SQLCOLUMNS() 把指定数据源表的列名和关于每列的信息存储到一个VisualFoxPro临时表中
SQLCOMMIT() 提交一个事务
SQLCONNECT() 建立一个指向数据源的连接
SQLDISCONNECT() 终止与数据源的连接
SQLEXEC() 将一条SQL语句送入数据源中处理
SQLGETPROP() 返回一个活动连接的当前设置或默认设置
SQLMORERESULTS() 如果存在多个结果集合,则将另一个结果集合复制到VisualFoxPro临时表中
SQLPREPARE() 在使用SQLEXEC()执行远程数据 *** 作前,可使用本函数使远程数据为将要执行的命令做好准备
SQLROLLBACK() 取消当前事务处理期间所做的任何更改
SQLSETPROP() 指定一个活动连接的设置
SQLSTRINGCONNECT() 使用一个连接字符串建立和数据源的连接
SQLTABLES() 把数据源中的表名存储到VisualFoxPro临时表中
SYS(14) 索引表达式
SYS(21) 控制索引编号
SYS(22) 控制标识名或索引名
SYS(2011) 返回当前工作区中记录锁定或表锁定的状态
SYS(2012) 返回表的备注字段块大小
SYS(2021) 筛选索引表达式
SYS(2029) 返回与表类型对应的值
SYS(3054) Rushmore优化等级 ·
TAG() 返回打开的.CDX多项复合索引文件的标识名,或者返回打开的.IDX单项索引文件的文件名
TAGCOUNT() 返回复合索引文件(.CDX)标识以及打开的单项索引文件(.IDX)的数目
TAGNO() 返回复合索引文件(.CDX)标识以及打开的单项索引(.IDX)文件的索引位置
TARGET() 返回一个表的别名,该表是SETRELATION命令的INTO子句所指定关系的目标
UNIQUE() 用于测试索引是否以惟一性方式建立
UPDATED() 用于测试在最近的READ命令中,数据是否已被修改
USED() 确定是否在指定工作区中打开了一个表
XMLTOCURSOR() 转换XML文本到VisualFoxPro游标或表
----------------------------------------------
Visual FoxPro日期和时间函数
CTOD()把字符表达式转换成日期表达式。
CDOW()从给定日期或日期时间表达式中返回星期值。
CMONTH()返回给定日期或日期时间表达式的月份名称。
CTOD()把字符表达式转换成日期表达式。
CTOT()从字符表达式返回一个日期时间值。
DATE()返回由 *** 作系统控件的当前系统日期,或创建一个与2000年兼容的日期值。
DATETIME()以日期时间值返回当前的日期和时间, 或创建一个 2000 兼容的日期时间值。
DAY()以数值型返回给定日期表达式或日期时间表达式是某月中的第几天。
DMY()从一个日期型或日期时间型表达式返回一个“日-月-年”格式的字符表达式(例如,31 May 1995)。月名不缩写。
DTOC()由日期或日期时间表达式返回字符型日期。
DTOS()从指定日期或日期时间表达式中返回 yyyymmdd 格式的字符串日期。
DTOT()从日期型表达式返回日期时间型值。
GOMONTH()对于给定的日期表达式或日期时间表达式,返回指定月份数目以前或以后的日期。
HOUR()返回日期时间表达式的小时部分。
MDY()以“月-日-年”格式返回指定日期或日期时间表达式,其中月份名不缩写。
MINUTE()返回日期时间型表达式中的分钟部分。
MONTH()返回给定日期或日期时间表达式的月份值。
QUARTER()返回一个日期或日期时间表达式中的季度值。
SEC()返回日期时间型表达式中的秒钟部分。
SECONDS()以秒为单位返回自午夜以来经过的时间。
SYS(1)以日期数字字符串的形式返回当前系统日期。
SYS(2)返回自午夜零点开始以来的时间,按秒计算。
SYS(10)将 (Julian) 日期转换成一个字符串。
SYS(11)将日期格式表示的日期表达式或字符串转换成 (Julian) 日期。
TIME()以 24 小时制、8 位字符串(时:分:秒)格式返回当前系统时间。
TTOC()从日期时间表达式中返回一个字符值。
TTOD()从日期时间表达式中返回一个日期值。
WEEK()从日期表达式或日期时间表达式中返回代表一年中第几周的数值。
YEAR()从指定的日期表达式中返回年份。
Visual FoxPro字符函数
ALLTRIM(). 删除指定字符表达式的前后空格符
ASC() 返回字符表达式中最左边字符的ANSI值
AT() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中首次出现的位置
AT_C() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中首次出现的位置
ATC() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中首次出现的位置
ATCC() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中首次出现的位置
ADDBS() 如果必要,向一个路径表达式添加一个反斜杠
ATCLINE() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中第一次出现的行号
ATLINE() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段中首次出现的行号
BETWEEN() 判断一个表达式的值是否在另外两个相同数据类型的表达式的值之间
CHR() 根据指定的ANSI数值代码返回其对应的字符
CHRTRAN() 将第一个字符表达式中与第二个表达式的字符相匹配的字符替换为第3个表达式中相应的字符
CHRTRANC() 将第一个字符表达式中与第二个表达式的字符相匹配的字符替换为第3个表达式中相应的字符
CPCONVERT() 把字符、备注字段或字符表达式转换到其他代码页
CHRSAW() 确定一个字符是否出现在键盘缓冲区中
CHRTRAN() 在一个字符表达式中,把与第二个表达式字符相匹配的字符替换为第三个表达式中相应字符
CHRTRANC() 将第一个字符表达式中与第二个表达式的字符相匹配的字符替换为第三个表达式中相应的字符
DIFFERENCE() 返回0到4间的一个整数,表示两个字符表达式间的相对语音差别
EMPTY() 确定表达式是否为空值
GErWORDCOUNr() 计数一个中中的单词数
GETWORDNUM() 从一个串中返回一个指定的词
INLIST() 判断一个表达式是否与一组表达式中的某一个相匹配 '
ISALPHA() 判断字符表达式的最左边一个字符是否为字母
ISBLANK() 判断表达式是否为空值
ISDIGIT() 判断字符表达式的最左边一个字符是否为数字(0到9)
ISLEADBYTE() 如果字符表达式第一个字符的第一个字节是前导字节,则返回"真"(T)
ISLOWER() 判断字符表达式最左边的字符是否为小写字母
ISMOUSE() 判断计算机是否具有鼠标
ISNULL() 判断计算结果是否为NULL值
ISUPPER() 判断字符表达式的第一个字符是否为大写字母(A~z)
LEFT() · 从字符表达式最左边一个字符开始返回指定数目的字符
LEPTC() 从字符表达式最左边一个字符开始返回指定数目的字符
LEN() 返回字符表达式中字符的数目
LENC() 返回字符表达式中字待的数目
LIKE() 确定一个字符表达式是否与另一个字符表达式相匹配
LIKEC() 决定一个字符表达式是否与另一个字符表达式相匹配
LOWER() 以小写字母形式返回指定的字符表达式
LTRIM() 删除指定的字符表达式的前导空格,然后返回得到的表达式
OCCURS() 返回一个字符表达式在另一个字符表达式中出现的次数
OEMTOANSI() 用于将字符串表达式中的字符转换成与其相对应的ANSI字符集中的字符
PADL()、PADR()、PADC() 由一个表达式返回一个字符中,并从左边,右边或同时从两边用空格或字符把该字符串填充到 指定长度
PROPER() 从字符表达式中返回一个字符串,字符串中的每个首字母大写
RAT() 返回一个字符表达式或备注字段在另一个字符表达式或备注字段内第一次出现的位置,从最右 边的字符算起
RATC() 返回一个字符表达式在另-个字符表达式或备注字段最后一次出现所在的行号,从最后-行算起
RATLINE() 回一个字符表达式或备注字段在另一个字符表达式或备注字段中最后出现的行号,从最后一行 开始计数 。
REPUCATE() 返回一个字符串,这个字符串是将指定字符表达式重复指定次数后得到的
RIGHT() 从一个字符串的最右边开始返回指定数目的字符
RIGHTC() 从一个字符串中返回最右边指定数目的字符
RTRIM() 删除了字符表达式后续空格后,返回结果字符串
SOUNDEX() 返回指定的字符表达式的语音表示
SPACE() 返回由指定数目的空格构成的字符串
STR() 返回与指定数值表达式对应的字符
STRCONV() 将字符表达式转换成另一种形式
STREXTRACT() 返回一个两个分隔符间的串
STRTRAN() 在第一个字符表达式或备注字段中,搜索第二个字符表达式或备注字段,并用第3个字符表达-式或备注字段替换每次出现的第2个字符表达式或备注字段
STUFF() 返回一个字符串,此字符串是通过用另一个字符表达式替换现有字符表达式中指定数目的字符得到的
STUFFC() 返回一个字符串,此字符串是通过用另一个字符表达式替换现有字符表达式中指定数目的字符、得到的
SUBSTR() 从给定的字符表达式或备注字段中返回字符串
SUBSTRC() 从给定的字符表达式或者备注字段返回字符串
SYS(15) 替换字符串中的字符
SYS(20) 转换德文文本
TEXTMERGE() 提供串表达式的求值 。
TRIM() 返回删除全部后缀空格后的指定字符表达式
TXTWIDTH() 按照字体平均字符宽度返回字符表达式的长度
TYPE() 计算字符表达式,并返回其内容的数据类型
UPPER() 用大写字母返回指定的字符表达式
----------------------------------------------
Visual FoxPro数值函数
ABS() 返回指定数值表达式的绝对值
ACOS() 返回指定数值表达式的反余弦值
ASIN() 返回数值表达式的反正弦弧度值
ATAN() 返回数值表达式的反正切弧度值
ATN2() 返回指定值的反正切值,返回值无象限限制
BINTOC() 将整型用二进制字符型表示 。
BITAND() 返回两个数值型数值在按位进行AND运算后的结果
BITCLEAR() 清除一个数值型数值的指定位(将此位设置成0),并返回结果值
BITLSHIFr() 返回一个数值型数值向左移动给定位后的结果
BrrNOT() 返回一个数值型数值按位进行NOT运算的结果
BITOR() 返回两个数值型数值按位进行OR运算的结果
BITRSHIFF() 返回一个数值型数值向右移动指定位后的结果
BITSET() 将一个数值型数值的某一位设置为1并返回结果
BITTEST() 确定一个数值型数值的指定位是否为1
BITXOR() 返回两个数值型数值按位进行异或运算的结果
CEILING() 返回大于或等于指定数值表达式的最小整数
COS() 返回数值表达式的余弦值
CTOmN() 将二进制字符型表示转换为整数
DTOR() 将度转换为弧度
EVALUATE() 计算字符表达式的值并返回结果
EVL() 从两个表达式中返回一个非空值
EXP() 返回eAx的值,其中x是某个给定的数值型表达式
FLOOR() 对于给定的数值型表达式值,返回小于或等于它的最大整数
FV() 返回一笔金融投资的未来值
INT() 计算一个数值表达式的值,并返回其整数部分
LOG() 返回给定数值表达式的自然对数(底数为c)
LOGl0() 返回给定数值表达式的常用对数(以10为底) ·
MAX() 对几个表达式求值,并返回具有最大值的表达式
MIN() 计算一组表达式,并返回具有最小值的表达式
MOD() 用一个数值表达式去除另一个数值表达式,返回余数
MTON() 由一个货币型表达式返回一个数值型值
NORMALIZE() 把用户提供的字符表达式转换为可以与VisualFoxPro函数返回值相比较的格式
NTOM() 由一个数值表达式返回含有四位小数的货币值
NVL() 从两个表达式返回一个非null值
PAYMENT() 返回固定利息贷款按期兑付的每一笔支出数量
PI() 返回数值常数n
PV() 返回某次投资的现值
RAND() 返回一个0到1之间的随机数
ROUND() 返回圆整到指定小数位数的数值表达式
RTOD() 将弧度转化为度
SIGN() 当指定数值表达式的值为正、负或0时,分别返回1、-1或0
SIN() 返回一个角度的正弦值 ·
SQRT() 返回指定数值表达式的平方根
SYS(2007) 返回一个字符表达式的检查求和值
TAN() 返回角度的正切值
VAL() 由数字组成的字符表达式返回数字值
作者 | 沉默王二
来源 | CSDN博客
头图 | 付费下载自视觉中国
出品 | CSDN(ID:CSDNnews)
想学习,永远都不晚,尤其是针对 Java 8 里面的好东西,Optional 就是其中之一,该类提供了一种用于表示可选值而非空引用的类级别解决方案。作为一名 Java 程序员,我真的是烦透了 NullPointerException(NPE),尽管和它熟得就像一位老朋友,知道它也是迫不得已——程序正在使用一个对象却发现这个对象的值为 null,于是 Java 虚拟机就怒发冲冠地把它抛了出来当做替罪羊。
当然了,我们程序员是富有责任心的,不会坐视不管,于是就有了大量的 null 值检查。尽管有时候这种检查完全没有必要,但我们已经习惯了例行公事。终于,Java 8 看不下去了,就引入了 Optional,以便我们编写的代码不再那么刻薄呆板。
没有 Optional 会有什么问题
我们来模拟一个实际的应用场景。小王第一天上班,领导老马就给他安排了一个任务,要他从数据库中根据会员 ID 拉取一个会员的姓名,然后将姓名打印到控制台。虽然是新来的,但这个任务难不倒小王,于是他花了 10 分钟写下了这段代码:
1public class WithoutOptionalDemo {
2 class Member {
3 private String name;
4
5 public String getName() {
6 return name;
7 }
8
9 public void setName(String name) {
10 thisname = name;
11 }
12 }
13
14 public static void main(String[] args) {
15 Member mem = getMemberByIdFromDB();
16 if (mem != null) {
17 Systemoutprintln(memgetName());
18 }
19 }
20
21 public static Member getMemberByIdFromDB() {
22 // 当前 ID 的会员不存在
23 return null;
24 }
25}
由于当前 ID 的会员不存在,所以 getMemberByIdFromDB() 方法返回了 null 来作为没有获取到该会员的结果,那就意味着在打印会员姓名的时候要先对 mem 判空,否则就会抛出 NPE 异常,不信?让小王把 if (mem != null) 去掉试试,控制台立马打印错误堆栈给你颜色看看。
1Exception in thread "main" javalangNullPointerException
2 at comcmowerdzoneoptionalWithoutOptionalDemomain(WithoutOptionalDemojava:24)
Optional 是如何解决这个问题的
小王把代码提交后,就兴高采烈地去找老马要新的任务了。本着虚心学习的态度,小王请求老马看一下自己的代码,于是老王就告诉他应该尝试一下 Optional,可以避免没有必要的 null 值检查。现在,让我们来看看小王是如何通过 Optional 来解决上述问题的。
1public class OptionalDemo {
2 public static void main(String[] args) {
3 Optional optional = getMemberByIdFromDB();
4 optionalifPresent(mem -> {
5 Systemoutprintln("会员姓名是:" + memgetName());
6 });
7 }
8
9 public static Optional getMemberByIdFromDB() {
10 boolean hasName = true;
11 if (hasName) {
12 return Optionalof(new Member("沉默王二"));
13 }
14 return Optionalempty();
15 }
16}
17class Member {
18 private String name;
19
20 public String getName() {
21 return name;
22 }
23
24 // getter / setter
25}
getMemberByIdFromDB() 方法返回了 Optional 作为结果,这样就表明 Member 可能存在,也可能不存在,这时候就可以在 Optional 的 ifPresent() 方法中使用 Lambda 表达式来直接打印结果。
Optional 之所以可以解决 NPE 的问题,是因为它明确的告诉我们,不需要对它进行判空。它就好像十字路口的路标,明确地告诉你该往哪走。
创建 Optional 对象
1)可以使用静态方法 empty() 创建一个空的 Optional 对象
1Optional empty = Optionalempty();
2Systemoutprintln(empty); // 输出:Optionalempty
2)可以使用静态方法 of() 创建一个非空的 Optional 对象
1Optional opt = Optionalof("沉默王二");
2Systemoutprintln(opt); // 输出:Optional[沉默王二]
当然了,传递给 of() 方法的参数必须是非空的,也就是说不能为 null,否则仍然会抛出 NullPointerException。
1String name = null;
2Optional optnull = Optionalof(name);
3)可以使用静态方法 ofNullable() 创建一个即可空又可非空的 Optional 对象
1String name = null;
2Optional optOrNull = OptionalofNullable(name);
3Systemoutprintln(optOrNull); // 输出:Optionalempty
ofNullable() 方法内部有一个三元表达式,如果为参数为 null,则返回私有常量 EMPTY;否则使用 new 关键字创建了一个新的 Optional 对象——不会再抛出 NPE 异常了。
判断值是否存在
可以通过方法 isPresent() 判断一个 Optional 对象是否存在,如果存在,该方法返回 true,否则返回 false——取代了 obj != null 的判断。
1Optional opt = Optionalof("沉默王二");
2Systemoutprintln(optisPresent()); // 输出:true
3
4Optional optOrNull = OptionalofNullable(null);
5Systemoutprintln(optisPresent()); // 输出:false
Java 11 后还可以通过方法 isEmpty() 判断与 isPresent() 相反的结果。
1Optional opt = Optionalof("沉默王二");
2Systemoutprintln(optisPresent()); // 输出:false
3
4Optional optOrNull = OptionalofNullable(null);
5Systemoutprintln(optisPresent()); // 输出:true
非空表达式
Optional 类有一个非常现代化的方法——ifPresent(),允许我们使用函数式编程的方式执行一些代码,因此,我把它称为非空表达式。如果没有该方法的话,我们通常需要先通过 isPresent() 方法对 Optional 对象进行判空后再执行相应的代码:
1Optional optOrNull = OptionalofNullable(null);
2if (optOrNullisPresent()) {
3 Systemoutprintln(optOrNullget()length());
4}
有了 ifPresent() 之后,情况就完全不同了,可以直接将 Lambda 表达式传递给该方法,代码更加简洁,更加直观。
1Optional opt = Optionalof("沉默王二");
2optifPresent(str -> Systemoutprintln(strlength()));
Java 9 后还可以通过方法 ifPresentOrElse(action, emptyAction) 执行两种结果,非空时执行 action,空时执行 emptyAction。
1Optional opt = Optionalof("沉默王二");
2optifPresentOrElse(str -> Systemoutprintln(strlength()), () -> Systemoutprintln("为空"));
设置(获取)默认值
有时候,我们在创建(获取) Optional 对象的时候,需要一个默认值,orElse() 和 orElseGet() 方法就派上用场了。
orElse() 方法用于返回包裹在 Optional 对象中的值,如果该值不为 null,则返回;否则返回默认值。该方法的参数类型和值得类型一致。
1String nullName = null;
2String name = OptionalofNullable(nullName)orElse("沉默王二");
3Systemoutprintln(name); // 输出:沉默王二
orElseGet() 方法与 orElse() 方法类似,但参数类型不同。如果 Optional 对象中的值为 null,则执行参数中的函数。
1String nullName = null;
2String name = OptionalofNullable(nullName)orElseGet(()->"沉默王二");
3Systemoutprintln(name); // 输出:沉默王二
从输出结果以及代码的形式上来看,这两个方法极其相似,这不免引起我们的怀疑,Java 类库的设计者有必要这样做吗?
假设现在有这样一个获取默认值的方法,很传统的方式。
1public static String getDefaultValue() {
2 Systemoutprintln("getDefaultValue");
3 return "沉默王二";
4}
然后,通过 orElse() 方法和 orElseGet() 方法分别调用 getDefaultValue() 方法返回默认值。
1public static void main(String[] args) {
2 String name = null;
3 Systemoutprintln("orElse");
4 String name2 = OptionalofNullable(name)orElse(getDefaultValue());
5
6 Systemoutprintln("orElseGet");
7 String name3 = OptionalofNullable(name)orElseGet(OrElseOptionalDemo::getDefaultValue);
8}
注:类名 :: 方法名是 Java 8 引入的语法,方法名后面是没有 () 的,表明该方法并不一定会被调用。
输出结果如下所示:
1orElse
2getDefaultValue
3
4orElseGet
5getDefaultValue
输出结果是相似的,没什么太大的不同,这是在 Optional 对象的值为 null 的情况下。假如 Optional 对象的值不为 null 呢?
1public static void main(String[] args) {
2 String name = "沉默王三";
3 Systemoutprintln("orElse");
4 String name2 = OptionalofNullable(name)orElse(getDefaultValue());
5
6 Systemoutprintln("orElseGet");
7 String name3 = OptionalofNullable(name)orElseGet(OrElseOptionalDemo::getDefaultValue);
8}
输出结果如下所示:
1orElse
2getDefaultValue
3orElseGet
咦,orElseGet() 没有去调用 getDefaultValue()。哪个方法的性能更佳,你明白了吧?
获取值
直观从语义上来看,get() 方法才是最正宗的获取 Optional 对象值的方法,但很遗憾,该方法是有缺陷的,因为假如 Optional 对象的值为 null,该方法会抛出 NoSuchElementException 异常。这完全与我们使用 Optional 类的初衷相悖。
1public class GetOptionalDemo {
2 public static void main(String[] args) {
3 String name = null;
4 Optional optOrNull = OptionalofNullable(name);
5 Systemoutprintln(optOrNullget());
6 }
7}
这段程序在运行时会抛出异常:
1Exception in thread "main" javautilNoSuchElementException: No value present
2 at javabase/javautilOptionalget(Optionaljava:141)
3 at comcmowerdzoneoptionalGetOptionalDemomain(GetOptionalDemojava:9)
尽管抛出的异常是 NoSuchElementException 而不是 NPE,但在我们看来,显然是在“五十步笑百步”。建议 orElseGet() 方法获取 Optional 对象的值。
过滤值
小王通过 Optional 类对之前的代码进行了升级,完成后又兴高采烈地跑去找老马要任务了。老马觉得这小伙子不错,头脑灵活,又干活积极,很值得培养,就又交给了小王一个新的任务:用户注册时对密码的长度进行检查。
小王拿到任务后,乐开了花,因为他刚要学习 Optional 类的 filter() 方法,这就派上了用场。
1public class FilterOptionalDemo {
2 public static void main(String[] args) {
3 String password = "12345";
4 Optional opt = OptionalofNullable(password);
5 Systemoutprintln(optfilter(pwd -> pwdlength() > 6)isPresent());
6 }
7}
filter() 方法的参数类型为 Predicate(Java 8 新增的一个函数式接口),也就是说可以将一个 Lambda 表达式传递给该方法作为条件,如果表达式的结果为 false,则返回一个 EMPTY 的 Optional 对象,否则返回过滤后的 Optional 对象。
在上例中,由于 password 的长度为 5 ,所以程序输出的结果为 false。假设密码的长度要求在 6 到 10 位之间,那么还可以再追加一个条件。来看小王增加难度后的代码。
1Predicate len6 = pwd -> pwdlength() > 6;
2Predicate len10 = pwd -> pwdlength() < 10;
3
4password = "1234567";
5opt = OptionalofNullable(password);
6boolean result = optfilter(len6and(len10))isPresent();
7Systemoutprintln(result);
这次程序输出的结果为 true,因为密码变成了 7 位,在 6 到 10 位之间。想象一下,假如小王使用 if-else 来完成这个任务,代码该有多冗长。
转换值
小王检查完了密码的长度,仍然觉得不够尽兴,觉得要对密码的强度也进行检查,比如说密码不能是“password”,这样的密码太弱了。于是他又开始研究起了 map() 方法,该方法可以按照一定的规则将原有 Optional 对象转换为一个新的 Optional 对象,原有的 Optional 对象不会更改。
先来看小王写的一个简单的例子:
1public class OptionalMapDemo {
2 public static void main(String[] args) {
3 String name = "沉默王二";
4 Optional nameOptional = Optionalof(name);
5 Optional intOpt = nameOptional
6 map(String::length);
7
8 Systemoutprintln( intOptorElse(0));
9 }
10}
在上面这个例子中,map() 方法的参数 String::length,意味着要 将原有的字符串类型的 Optional 按照字符串长度重新生成一个新的 Optional 对象,类型为 Integer。
搞清楚了 map() 方法的基本用法后,小王决定把 map() 方法与 filter() 方法结合起来用,前者用于将密码转化为小写,后者用于判断长度以及是否是“password”。
1public class OptionalMapFilterDemo {
2 public static void main(String[] args) {
3 String password = "password";
4 Optional opt = OptionalofNullable(password);
5
6 Predicate len6 = pwd -> pwdlength() > 6;
7 Predicate len10 = pwd -> pwdlength() < 10;
8 Predicate eq = pwd -> pwdequals("password");
9
10 boolean result = optmap(String::toLowerCase)filter(len6and(len10 )and(eq))isPresent();
11 Systemoutprintln(result);
12 }
13}
好了,我亲爱的读者朋友,以上就是本文的全部内容了——可以说是史上最佳 Optional 指南了,能看到这里的都是最优秀的程序员,二哥必须要伸出大拇指为你点个赞。
>
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
请告诉我没个函数是什么意思!!!
谢谢!!~~~
解析:
一、 数值函数
数值函数用于数值运算,其自变量与函数都是数值型数据。
1.取绝对值函数ABS( )
格式ABS(<nExp>)
功能计算nExp的值,并返回该值的绝对值。
2.指数函数EXP( )
格式EXP(<nExp>)
功能求以e为底、nExp值为指数的幂,即返回ex的值。
3.取整函数INT( )
格式INT(<nExp>)
功能计算nExp的值,返回该值的整数部分。
4.上界函数CEILING( )
格式CEILING(<nExp>)
功能计算nExp的值,返回一个大于或等于该值的最小整数。
5.下界函数FLOOR( )
格式FLOOR(<nExp>)
功能计算nExp的值,返回一个小于或等于该值的最大整数。
6.自然对数函数LOG( )
格式LOG(<nExp>)
功能求nExp的自然对数。nExp的值必须为正数。
7.常用对数函数
格式LOG10(<nExp>)
功能求nExp的常用对数。nExp的值必须为正数。
8.平方根函数SQRT( )
格式SQRT(<nExp>)
功能求非负nExp的平方根。
9.最大值函数MAX( )和最小值函数MIN( )
格式MAX(<nExp1>,< nExp2>[,< nExp3>])
MIN(<nExp1>,< nExp2>[,< nExp3>])
功能返回数值表达式中的最大值MAX( )和最小值MIN( )。
10.求余数函数MOD( )
格式MOD(<nExp1>,<nExp2>)
功能返回nExp1除以nExp2的余数。余数的小数位数与nExp1相同,符号与nExp2相同。
11.四舍五入函数ROUND( )
格式ROUND(<nExp1>,< nExp2>)
功能返回nExp1四舍五入的值, nExp2表示保留的小数位数。
12.π函数PI( )
格式PI( )
功能返回常量π的近似值
13.正弦函数SIN( )
格式SIN(<nExp>)
功能返回nExp的正弦值。nExp以弧度为单位,函数值域为[-1,1]。
14.余弦函数COS( )
格式COS(<nExp>)
功能返回nExp的余弦值。nExp以弧度为单位,函数的值域为[-1,1]。
15.正切函数TAN( )
格式TAN(<nExp>)
功能返回nExp的正切值。nExp以弧度为单位,其值为π/2或- π/2时,系统返回一个绝对值很大的数。
16.反正弦函数ASIN( )
格式ASIN(<nExp>)
功能返回nExp的反正弦值。自变量值必须在[-1,1]内,函数值为弧度,且值域为[-π/2, π/2]。
17.反余弦函数ACOS( )
格式ACOS(<nExp>)
功能返回nExp的反余弦值。自变量的值必须在[-1,1]内,函数值为弧度,值域为[-π/2, π/2]。
18.反正切函数ATAN( )
格式ATAN(<nExp>)
功能返回nExp的反正切值。函数值为弧度,值域为(-π/2, π/2)。
二、 字符函数
字符函数是处理字符型数据的函数,其自变量或函数值中至少有一个是字符型数据。函数中涉及的字符型数据项,均以cExp表示。
1.子串位置函数
格式AT(<cExp1>,< cExp 2>)
功能返回串cExp1在串cExp2中的起始位置。函数值为整数。如果串cExp2不包含串cExp1,函数返回值为零。
2.取左子串函数LEFT( )
格式LEFT(<cExp>,<nExp>)
功能返回从cExp串中第一个字符开始,截取nExp个字符的子串。
3.取右子串函数RIGHT( )
格式RIGHT(<cExp >,< nExp>)
功能返回从cExp串中右边第一个字符开始,截取nExp个字符的子串。有关说明同LEFT( )函数。
4.取子串函数SUBSTR( )
格式SUBSTR (<cExp>,<nExp1> [,< nExp2>] )
功能返回从串cExp中第nExp1个字符开始,截取nExp2个字符的子串。
5.字符串长度函数LEN( )
格式LEN(<cExp>)
功能返回cExp串的字符数(长度)。函数值为N型。
6.删除字符串前导空格函数LTRIM( )
格式LTRIM(<cExp>)
功能删除cExp串的前导空格字符。
7.删除字符串尾部空格函数RTRIM( ) | TRIM( )
格式RTRIM | TRIM(<cExp>)
功能删除cExp串尾部空格字符。
8.空格函数SPACE( )
格式SPACE (<nExp>)
功能返回一个包含nExp个空格的字符串。
9.字符串替换函数STUFF( )
格式STUFF(<cExp1>,<nExp1>,<nExp2>,<cExp2>)
功能从nExp1指定位置开始,用cExp2串替换 cExp1串中nExp2个字符。
10.字符复制函数 REPLICATE( )
格式REPLICATE (<cExp>,<nExp>)
功能返回将cExp串重复nExp次的字符串。
11.定义输出格式函数 TRANSFORM( )
格式TRANSFORM (<eExp>,<cExp>)
功能按格式描述式cExp指定的格式,输出任意表达式eExp的值。
12.大小写转换函数LOWER( ) 和UPPER( )
格式LOWER (<cExp>)
UPPER (<cExp>)
功能LOWER( )将cExp串中字母全部变成小写字母,UPPER( )将cExp串中字母全部变成大写字母,其它字符不变。
13.宏替换函数 &
格式& < cVar >[< cExp >]
功能替换出字符型变量cVar中字符。
三、 日期时间函数
日期时间函数是处理日期型或日期时间型数据的函数。其自变量为日期型表达式dExp或日期时间型表达式tExp。
1.系统日期函数DATE( )
格式DATE()
功能返回当前系统日期,此日期由Windows系统设置。函数值为D型。
2.系统时间函数TIME( )
格式TIME([<nExp>])
功能返回当前系统时间,时间显示格式为hh:mm:ss。若选择了nExp ,则不管为何值,返回的系统时间还包括秒的小数部分,精确至小数点后两位。函数值为C型。
3.日期函数DAY( )
格式DAY(<dExp>)
功能返回dExp式中的天数。函数值为N型
4.星期函数DOW( )、CDOW( )
格式DOW(<dExp>)
CDOW(<dExp>)
功能DOW( )函数返回dExp式中星期的数值,用1~7表示星期日~星期六。函数值为N型。CDOW( ) 函数返回dExp式中星期的英文名称。函数值为C型。
5.月份函数MONTH( )、CMONTH( )
格式MONTH(<dExp>)
CMONTH(<dExp>)
功能MONTH( )函数返回dExp式中月份数。函数值为N型。CMONTH( )函数则返回月份的英文名。函数值为C型。
6.年份函数YEAR( )
格式YEAR(<dExp>)
功能函数返回dExp式中年份值。函数值为N型。
四、转换函数
在数据库应用的过程中,经常要将不同数据类型的数据进行相应转换,满足实际应用的需要。Visual FoxPro系统提供了若干个转换函数,较好地解决了数据类型转换的问题。
1.ASCII码函数ASC( )
格式ASC (<cExp>)
功能返回cExp串首字符的ASCII码值。函数值为N型。
2.ASCII字符函数CHR( )
格式CHR(<nExp >)
功能返回以nExp值为ASCII码的ASCII字符。函数值为C型。
3.字符日期型转换函数CTOD( )
格式CTOD(<cExp>)
功能把“××/××/××”格式的cExp串转换成对应日期值。函数值为D型。
4.日期字符型转换函数DTOC( )
格式DTOC(<dExp >〔, 1〕)
功能把日期dExp转换成相应的字符串。函数值为C型。
5.数值字符型转换函数STR( )
格式STR(<nExp1>[,< nExp2>][,< nExp3>])
功能将nExp1的数值转换成字符串形式。函数值为C型。
6.字符数值型转换函数VAL( )
格式VAL (<cExp>)
功能将cExp串中数字转换成对应数值,转换结果取两位小数。函数值为N型。
五、 测试函数
在数据库应用的 *** 作过程中,用户需要了解数据对象的类型、状态等属性,Visual FoxPro提供了相关的测试函数,使用户能够准确地获取 *** 作对象的相关属性。
1.数据类型函数TYPE( )
格式TYPE(<cExp >)
功能返回cExp 串表示的数据对象的数据类型,返回值是一个表示数据类型的大写字母。C:字符型,D:日期型,N:数值型,L:逻辑型,M:备注型,G:通用型,U:未定义。
2.文件查找函数FILE()
格式FILE(<cExp>)
功能根据cExp串中指定路径查找文件,如未指定路径,则在默认目录中查找。文件存在,返回逻辑真(T) 值,否则为逻辑假(F)值。
3.条件测试函数IIF( )
格式IIF(<lExp >,<eExp 1>,<eExp2>)
功能逻辑表达式lExp值为真(T),返回表达式eExp1的值,否则返回表达式eExp2的值。eExp1和eExp2可以是任意数据类型的表达式。
4.表结束标志测试函数EOF( )
格式EOF([<工作区号> | <别名>])
功能测试记录指针是否移到表结束处。如果记录指针指向表中尾记录之后,函数返回真(T),否则为假(F)。
5.表起始标识测试函数BOF ( )
格式BOF ([<工作区号> | <别名>])
功能测试记录指针是否移到表起始处。如果记录指针指向表中首记录前面,函数返回真(T),否则为假(F)。工作区说明见EOF()函数。
6.当前记录号函数RECNO()
格式RECNO([<工作区号> | <别名>])
功能返回指定工作区中表的当前记录的记录号。对于空表返回值为1。
7.当前记录逻辑删除标志测试函数DELETED( )
格式DELETED([<工作区号> | <别名>])
功能测试指定工作区中表的当前记录是否被逻辑删除。如果当前记有逻辑删除标记,函数返回真(T),否则为假(F)。
8.记录数函数RECCOUNT( )
格式RECCOUNT ([<工作区号> | <别名>])
功能返回指定工作区中表的记录个数。如果工作区中没有打开表则返回0。
9.记录大小测试函数RECSIZE( )
格式RECSIZE( [<工作区号> | <别名>] )
功能返回指定工作区中表的记录总长度。如果工作区中没有打开表则返回0。
10.屏幕列坐标和行坐标函数 COL( )、ROW( )
格式COL ( )
ROW()
功能COL ( )返回光标的列坐标值,ROW ( )返回光标的行坐标值。
11.打印机列坐标和行坐标函数PCOL( ),PROW( )
格式PCOL( )
PROW()
功能返回打印机打印头所处位置的列坐标和行坐标。
以上就是关于excel批量不连续单元格公式如何加绝对值符号全部的内容,包括:excel批量不连续单元格公式如何加绝对值符号、数据库题 用P、V *** 作管理临界区时,把信号量mutex的初值设定为1。当mutex的等待队列中有、关于vf中foxpro的各项命令,希帮忙填写说明和举例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)