20145307第七周JAVA学习报告
20145307《Java程序设计》第七周学习总结
教材学习内容总结
Lambda
Lambda语法概述: Arrays的sort()方法可以用来排序,在使用sort()时,需要操作java.util.Comparator来进行说明,这样一来,语法就显得有些冗长。在JDK8中,可以使用Lambda语法改变Arrays.sort()的可读性: Comparator byLength =(String name1,String name2)->name1.length() - name2.length();
编译器可以从byLength变量的声明类型,推断name1与name2的类型,因此可以再简化为:Comparator byLength = (name1,name2)->name1.length() - name2.length();方法参考的特性,在重用现有API上扮演了重要角色。重用现有方法实作,可避免到处写下Lambda运算式,方法参考不仅避免了重复撰写Lambda表达式,也可以让程序代码更清楚.
Lambda表达式与函数接口:等号右边是Lambda表示式(Expression),等号左边是作为Lambda表示式的目标型态(Target type)Comparator byLength = (String name1,String name2)->name1.length() - name2.length();
如果有目标型态的话,在编译器可推断出类型的情况下,就可以不写出Lambda表示式的参数型态
Lambda表示式本身是中性的,不代表任何型态的实例,同样的Lambda表示式,可用来表示不同目标型态的对象操作
JDK8的Lambda并没有导入新类型来作为Lambda表达式的类型,而是就现有的interface语法来定义函数接口,作为Lambda表达式的目标类型。
如果接口使用了@FunctionalInterface来标注,而本身并非函数接口的话,就会引发编译错误。
Lambda遇上this与final:Lambda表示式并不是匿名类别的语法蜜糖,如果Lambda表示式中捕获的局部变量本身等效于final局部变量,可以不用在局部变量上加上final,JDK8特意禁止在Lambda中修改局部变量的值。 方法与构造函数参考:方法参考(Method references)可以避免你到处写下Lambda表示式,尽量运用现有的API实作,也可以改善可读性。
接口默认方法:在JDK8中,interface定义时可以加入默认操作,或者称为默认方法(Default methods),forEach()方法本身已有操作,所以不会破坏Iterable现有的其他操作。在默认方法中不能使用数据成员,因为接口本身不能定义数据成员,也就是默认方法中不能用直接变更状态的流程。
Functional与Stream API 使用Optional取代null:null的最根本问题在于语义含糊不清,调用方法时如果返回类型是Optional,应该立即想到它可能包含也可能不包含值,在Optional没有包含值的情况下,get会抛出NoSuchElementException,Optional的ofNullable()来衔接程式库中会传回null的方法。 标准API的函数接口:基本上可以分为Consumer、Function、Predicate与Supplier四个类型
如果需要的行为是接受一个自变量,然后处理后不传回值,就可以使用Consumer接口,接受了自变量但没有传回值,这行为就像纯綷消耗了自变量,就是命名为Consumer的原因。如果真的有结果产生,就是以副作用(Side effect)形式呈现,例如:
Arrays.asList("Justin","Monica","Irene").forEach(out::println);
接受一个自变量,然后以该自变量进行计算后传回结果,就可以使用Function接口,行为就像是数学函数y=f(x),给予x值计算出y值的概念,因此命名为Function。
接受一个自变量,然后只传回boolean值,也就是根据传入的自变量直接论断真假的行为,就可以使用Predicate函数接口。 需要的行为是不接受任何自变量,然后传回值,那可以使用Supplier函数接口。
使用Stream进行管道操作:绝大多数的Stream并不需要呼叫close()方法,JDK8中要close()的是Files.lines()、Files.list()与Files.walk()方法。
JDK8引入了Stream API,也引入了管道操作风格,一个管道基本上包括了几个部分:来源、零或多个中间操作、一个最终操作。
时间与日期
时间的度量:
就目前来说,即使标注为格林威治标准时间(GMT时间),实际上谈到时间指的是UTC时间。 秒的单位定义是基于TAI,也就是铯原子辐射振动次数。 UTC考虑了地球自转越来越慢而有闰秒修正,确保UTC与UT相差不会超过0.9秒。 Unix时间是1970年1月1日00:00:00 为起点而经过的秒数,不考虑闰秒。
年历简介:
儒略历:修正了罗马历隔三年设置一闰年的错误,改采四年一闰。 格里高利历:改革了儒略历。 ISO 8601标准:并非年历系统,而是时间日期表示方法的标准,用以统一时间日期的数据交换格式。
认识时区:牵涉到地理、法律、经济、社会甚至政治等问题
UTC偏移(offset)。 有些国家的领土横跨的经度很大,一个国家有多个时间反而造成困扰,因而不採取每15度偏移一小时的作法。
实施日光节约时间(Daylight saving time)。 认识Date与Calender
时间轴上瞬间的Date:
如果想要取得系统时间,方法之一是使用System.currentTimeMillis()方法,返回的是long类型整数,代表1970年1月1日0时0分0秒0毫秒至今经过的毫秒数,有人会使用Date实例来取得系统时间描述,不过Date也是偏向机器的时间观点
Date有两个构造函数可以使用,一个可使用epoch毫秒数构建,另一个为无自变量构造函数,内部亦是使用System.currentTimeMillis()取得毫秒数,调用getTime()可取得内部保存的epoch毫秒数值。 不建议使用toString()来得知年月日等栏位资讯,有关于字串时间格式的处理,不再是Date的职责。
格式化时间日期的DateFormat:
字串时间格式的处理,职责落到了java.text.DateFormat身上,其操作类别java.text.SimpleDateFormat,可以直接建构SimpleDateFormat实例,或使用DateFormat的getDateInstance()、getTimeInstance()、getDateTimeInstance()等静态方法。 直接构建SimpleDateFormat的好处是,可使用模式字符串自定义格式。
处理时间日期的Calendar:
想要取得某个时间日期资讯,或者是对时间日期进行操作,可以使用Calendar实例,通过Calendar的getInstance()取得的Calendar实例,默认就是取得GregorianCalendar实例,例如:
Calendar calendar = Calendar.getInstance();
取得Calendar实例后,可以使用getTime()取得Date实例,如果想要取得年月日等日期时间字段,可以使用get()方法指定Calender上的字段枚举常数:
out.println(calendar.get(Calendar.YEAR)); out.println(calendar.get(Calendar.MOUNTH)); out.println(calendar.get(Calendar.DATE));
如果要设定时间日期等字段,不要对Date设定,应该使用Calendar,同样地,月份的部分使用枚举常数设定:
Calendar calendar = Calendar.getInstace(); calendar.set(2016,Calendar.JAN,2); //2016/1/2 out.println(calendar.get(Calendar.YEAR)); //2016 out.println(calendar.get(Calendar.MOUNTH)); //Calendar.JAN为1 out.println(calendar.get(Calendar.DATE)); //2
在取得一个Calendar的实例后,可以使用add()方法,来改变Calendar的时间:
calendar.add(Calendar.MONTH,1); //Calendar时间加一个月 calendar.add(Calendar.HOUR,3); //Calendar时间加三小时 calendar.add(Calendar.YEAR,-2); //Calendar时间减两年 calendar.add(Calendar.DATE,3); //Calendar时间加三天
如果打算只针对日期中某个字段加减,则可以使用roll()方法:
calendar.roll(Calendar.DATE,1); //只对日字段加1
设定TimeZone:
使用java.util.TimeZone的getDefault()来取得默认时区信息。
想要取得指定时区的TimeZone实例,可以使用ID字串,例如:
TimeZone taipeiTz = TimeZone.getTimeZone("Asia/Taipei");
JDK8新时间日期API
机器时间观点的API:
Date名称看来像是人类的时间概念,实际却是机器的时间概念,混淆机器与人类时间观点会引发的问题之一像是日光节约时间。 不该使用Date实例的toString()来得知人类观点的时间信息,Date实例应该只代表机器观点的时间资讯,真正可靠的资讯只有内含的epoch毫秒数。
人类时间观点的API:
对于片段的日期时间,JDK8新时间与日期API有LocalDateTime()、LocalDate()、LocalTime()等类来定义,这些类基于ISO 8601年历系统,是不具时区的时间与日期定义。 在新的时间与日期API中,UTC偏移量与时区的概念是分开的,offsetDateTime单纯代表UTC偏移量,使用ISO 8601。如果只想表示2014年,可以使用Year,如果想表示2014/5,可以使用YearMonth,如果只想表示5月,可以使用Month,如果想表示5/4,可以使用MonthDay,其中Month是enum型,如果你想要取得代表月份的数字,不要使用oridinal()方法,因为oridinal()是enum在定义时的顺序,从0开始,想要取得代表月份的数要通过getValue()方法。
对时间的运算:period与Duration乍看有些难区别,period是日期差,between()方法只接受LocalDate,不表示比“日”更小的单位。然而Duration是时间差,between()方法可以接受LocalDateTime()、LocalDate()、LocalTime(),不表示比“天”更大的单位。
20145307第七周JAVA学习报告的更多相关文章
- 20145307第9周JAVA学习报告
20145307陈俊达 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC(Java DataBase Connectivity)即java数据库连接,是一种用于执行SQL语句 ...
- 20145307第八周JAVA学习报告
20145307<Java程序设计>第8周学习总结 教材学习内容总结 通用API 日志API 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是logge ...
- 20145307第十周JAVA学习报告
教材学习内容总结 Java的网络编程 1.计算机网络概述 (1)路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,通过光纤.网线等连接将设备连接起来,从而形成了一张巨大的计算 ...
- 20165203《Java程序设计》第七周Java学习总结
20165203<Java程序设计>第七周Java学习总结 教材学习内容总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称MySQL,是世 ...
- 第七周java学习总结
学号 20175206 <Java程序设计>第七周学习总结 教材学习内容总结 第八章: 主要内容 String类 StringTokenizer类 Scanner类 StringBuffe ...
- 20165223《Java程序设计》第七周Java学习总结
教材学习内容总结 第11章-JDBC与MySQL数据库 要点 MySQL数据库管理系统 连接MySQL数据库 查询操作(基础) 更新.添加.删除(基础) 预处理语句(重点) 通用查询(难点) 事务 笔 ...
- 20145304 第五周Java学习报告
20145304<Java程序设计>第5周学习总结 教材学习内容总结 1.使用try.catch: 如果使用了try.catch,编译时会尝试执行try区块中的程序代码,如果有错误,执行流 ...
- 2019年8月12日~8月18日 第七周JAVA学习总结
本周主要完成了PTA代码编写的任务,将报告也完成了,但是由于同学聚会比较多所以JAVA的学习比较少,也没有学习统一建模语言.用在编程的时间平均每天5个小时,用在JAVA学习上平均每天1个小时,用在解决 ...
- 201521123105 第七周Java学习总结
1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 以下是ArrayList的contains源代码: public boole ...
随机推荐
- java如何发起一次http的post请求?
@RequestMapping(value = "loginInSSO", method = RequestMethod.GET) public String loginInSSO ...
- jQuery返回顶部实用插件YesTop
只需一句jQuery代码实现返回顶部效果体验:http://hovertree.com/texiao/yestop/ 使用方法:只需引用jQuery库和YesTop插件(jquery.yestop.j ...
- Hadoop单点伪分布模式安装
Hadoop单点伪分布模式安装 概述 单点 single-node,单节点,即一台计算机. 伪分布式模式 pseudo-distributed mode 所谓集群,表面上看是多台计算机联合完成任务:但 ...
- Oracle涂抹oracle学习笔记第10章Data Guard说,我就是备份
DG 是备份恢复工具,但是更加严格的意义它是灾难恢复 Data Guard是一个集合,由一个Primary数据库及一个或者多个Standby数据库组成,分两类逻辑Standby和物理Standby 1 ...
- UVALive 6933 Virus synthesis(回文树)
Viruses are usually bad for your health. How about ghting them with... other viruses? In this proble ...
- mysql IPv4 IPv6
w如何通过一个mysql方法,而不是借助脚本判断?INET6_ATON(expr) https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-func ...
- Spark2.0机器学习系列之11: 聚类(幂迭代聚类, power iteration clustering, PIC)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet all ...
- 查看pc ip地址
1.使用Windows+R键打开“运行”窗口,然后输入CMD进入命令提示窗口 2.进入命令窗口之后,输入:ipconfig/all 回车即可看到整个电脑的详细的IP配置信息
- SDUT3141:Count(哈希)好题
题目:传送门 题目描述 You are given an integer array s[] and are asked to count how many positions a, b, c and ...
- 编译安装MariaDB-10.0.21
一.源码编译安装gcc-5.1.0 1.下载gcc源码包 Download (HTTP): http://ftpmirror.gnu.org/gcc/gcc-5.2.0/gcc-5.2.0.tar.b ...