方法参考的特性,在重用现有的API上扮演了重要的角色。重用现有方法操做,能够避免处处写下lambda表达式。方法参考不只避免了重复撰写lambda表达式,也可让程序代码更为清楚。html
在只有lambda表达式的状况下,参数的类型必须写出来,若是有目标类型的话,在编译程序能够推断出类型的状况下能够不写出lambda表达式的参数类型。lambda表达式自己是中性的,不表明任何类型的实例,一样的lamb表达式能够用来表示不一样目标类型的对象操做。java
lambda并无导入新类型来做为lambda表达式的类型,而是就现有的interface语法来定义函数接口,做为lambda表达式的目标类型。函数接口就是接口,可是要求仅仅具备单一抽象方法,许多现存的接口都是这种接口,例如标准API中的Runnable、Callable、Comparator等。git
匿名类有其应用的场合,在许多时候特别是接口只有一个的方法要操做时,只需关心参数和操做自己而不是雷和方法名称,lambda表达式只关心方法命名上的参数和返回定义,但忽略方法名称。windows
JDK8对interface语法作了演进容许有默认方法操做。ide
lambda表达式并非匿名类的语法蜜糖。认为lambda表达式是在哪一个名称范畴就能参考该范畴内的名称,像是变量和方法。在JDK8中,若是变量自己等效于final局部变量也就是说,若是变量不会再匿名类中又从新指定的动做,就能够不用加上final关键词。若是lambda表达式中捕获的局部变量自己等效于final局部变量,能够不用再局部变量上加上final。在lambda中不能修改局部变量的值。函数
只要静态方法的方法名称命名中参数和返回值定义相同,也可使用静态方法来定义函数接口操做。学习
除了参考静态方法做为函数接口操做以外,还能够参考特定对象的实例方法。函数接口操做也能够参考类上定义的非静态方法,函数接口会试图用第一个参数方法接收者,而以后的参数依次做为被参考的非静态方法的参数。JDK8还提供了构造函数参考,用来重用现有API的对象构建流程。ui
调用方法时若是返回类型是Optional,它可能包含值也可能不包含值。JDK8中定义的通用函数接口,基本上放置于java.util。function套件之中,就行为来讲,基本上能够分为Consumer、Function、Predicate与Supplier四个类型。.net
JDK8中引入StreamAPI,也引入了管道操做风格,一个管道基本上包括了几个部分:来源,零或多个中间操做,一个最终操做。线程
GMT时间如今已经不做为标准时间使用,但GMT时间经常被当成UTC时间。在导入UTC时间以前,GMT和UT是相同的。UTC时间是具备折中修正版本的世界协调时间,这是为了保持TAI和UT时间不要相差太大,UTC时间采用了闰秒修正。
Unix系统的时间表示法定义为UTC时间的1970年1月1日0时0分0秒为起点通过的秒数,不考虑闰秒修正,用以表达时间轴上的某一瞬间。Epoch为某个特定时代的开始,时间轴上的某一瞬间。各个国家修改日历的时间并不相同,因此在Unix或者Linux中查询1752年9月会发现时间少了11天。
ISO8601在严格意义上并不是年历系统而是时间日期表示方法的标准,用以统一时间日期的数据交换格式,ISO8601在数据定义上大部分与格里高日历相同,但有些细微差异。在ISO8601的定义中19世纪是1900-1999年,而在格里高日历中19世纪是1801-1900年。
取得系统时间的方法之一是使用System.currentTimeMillis()
方法返回的是long
类型的整数表示从1970年1月1日0时0分0秒到如今通过的毫秒数。时间起点和Unix时间起点是相同的,此方法得到的时间是机器观点表明时间轴上的某一瞬间,对人类来讲没有阅读意义。
JDK8新时间日期处理API中最重要的就是清楚地将机器对时间的概念和人类对时间的概念区分开来,让时间与人类对时间的概念的界限变得分明。
Button bt = new Button(); bt.addActionListener(event -> { ui.showSomething(); });
File dir = new File("/an/dir/"); File[] dirs = dir.listFiles((File f) -> { System.out.println("Log:..."); return f.isDirectory(); } );
关于使用Lambdas排序集合的问题:根据成员的name, surname, name长度以及最后一个字母,使用Comparator 类来排序集合,首先根据name来排序list。
不用lambda表达式的办法:
String[] players = { "Rafael Nadal", "Novak Djokovic", "Stanislas Wawrinka", "David Ferrer", "Roger Federer", "Andy Murray", "Tomas Berdych", "Juan Martin Del Potro", "Richard Gasquet", "John Isner"}; Arrays.sort(players, new Comparator<String>() { @Override public int compare(String s1, String s2) { return (s1.compareTo(s2)); } });
Comparator<String> sortByName = (String s1, String s2) -> (s1.compareTo(s2)); Arrays.sort(players, sortByName); //或者用另一种写法 Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));
E .copy f1.txt | f2.tx
public class ThreadTest { public static void main(String args[]){ MyThread myThread =new MyThread(); Thread t1=new Thread(myThread); Thread t2=new Thread(myThread); t1.start(); t2.start(); } } class MyThread extends Thread { ... }
A .1
B .2
C .3
D .4
A .Thread.sleep()
B .wait()
C .notify()
D .interrupt()
教材学习中的问题和解决过程, 一个问题加1分
代码调试中的问题和解决过程, 一个问题加1分
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 20篇 | 400小时 | |
第一周 | 10/10 | 1/4 | 12/12 | |
第二周 | 120/130 | 1/5 | 9/21 | |
第三周 | 210/340 | 1/6 | 9/30 | |
第四周 | 460/800 | 1/7 | 9/39 | |
第五周 | 400/1200 | 1/8 | 9/48 | |
第六周 | 300/1500 | 1/9 | 9/57 | |
第七周 | 300/1800 | 1/10 | 9/66 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进本身的计划能力。这个工做学习中很重要,也颇有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:9小时
实际学习时间:9小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)