1. Java 11有哪些新特性塘装?
JAVA 11是Java后第一個長期支持的版本
String API - isBlank() lines(); repeat()
File API
HttpClient加強: 直接創(chuàng)建碘勉,也不需要什么依賴包了计呈,HttpClient client = HttpClient.newHttpClient();
現(xiàn)在 Java 自帶了這個 HTTP Client API,我們以后還有必要用 Apache 的 HttpClient 工具包嗎拷淘;
Stream加強;
Lambda局部變量推斷:var 自動判斷變量類型;
javac, java, compile first, now you only need java to run the code
JAVA flight recorder, JVM檢查伴箩,免費的;
2. Java 8有哪些亮點:函數(shù)接口鄙漏,方法引用嗤谚,類型推導(dǎo)以及流式操作
filter()方法
orElse()方法
max()方法
Record()方法:public record Student(String name, Integer age){}
Optional
Optional類有一個isPresent()方法,你可以拿它做一個if-check怔蚌。但是我們由更簡短的方法——ifPresent()
distinct();? //去重
limit(3);
skip(2);
readString()
String text = Files.readString(Path.of("test.txt"));
新的Java Switch
var message = switch(status){}
Stream - 主要功能是:惰性的接口巩步;
有了像Predicate這樣的函數(shù)接口,我們就可以用lamada直接來使用這個函數(shù)接口了桦踊;
我們都知道?Lambda?和 Stream 是 Java 8 的兩大亮點功能椅野;
Stream 流操作是 Java 8 對集合操作功能的增強,專注于對集合的各種高效籍胯、便利竟闪、優(yōu)雅的聚合操作
Functional program or functional interface...
流式操作:同時支持串行和并行的兩種模式匯聚計算,流式操作的數(shù)據(jù)轉(zhuǎn)換(也稱映射)map
Optional?預(yù)防空指針杖狼,Stearm?流式操作炼蛤,LocalDateTime?時間操作;
Java 中的?Lambda?的時候本刽,你也會發(fā)現(xiàn)?Lambda?不僅沒有函數(shù)名稱鲸湃,有時候甚至連入?yún)⒑头祷囟伎梢允÷栽蹋@也讓代碼變得更加緊湊;
在?Java 8中已經(jīng)有很多接口已經(jīng)聲明為函數(shù)接口暗挑,如 Runnable笋除、Callable、Comparator 等炸裆;
Lambda 的語法主要是下面幾種:
一個lambda由用逗號分隔的參數(shù)列表垃它、–>符號、函數(shù)體三部分表示
Person.create(1,"竹子愛熊貓",(Personperson)->{System.out.println("ABCDEFG……");})? //函數(shù)在這里作為一個參數(shù)烹看;
可以簡化為:
Person.create(1,"zero",person->System.out.println("竹子愛熊貓….."));
一個Lambda表達(dá)式實現(xiàn)了接口里的有且僅有的唯一一個抽象方法国拇。那么對于這種接口就叫做函數(shù)式接口:
(params) -> expression
(params) -> {statements;}
Lambda 的語法特性:
使用->分割 Lambda 參數(shù)和處理語句。
類型可選惯殊,可以不指定參數(shù)類型酱吝,編譯器可以自動判斷。
圓括號可選土思,如果只有一個參數(shù)务热,可以不需要圓括號,多個參數(shù)必須要圓括號己儒。
花括號可選崎岂,一個語句可以不用花括號,多個參數(shù)則花括號必須闪湾。
返回值可選冲甘,如果只有一個表達(dá)式,可以自動返回途样,不需要 return 語句江醇;花括號中需要 return 語法。
Lambda 中引用的外部變量必須為 final 類型何暇,內(nèi)部聲明的變量不可修改嫁审,內(nèi)部聲明的變量名稱不能與外部變量名相同。
定義的函數(shù)接口@FunctionalInterface可以在之后直接使用赖晶;
而用方法引用的方式:實例/類::方法 - - 》User::getAge
foreEach方法:
?skills.forEach((skill)?->?System.out.print(skill+","));
示例2因為用的 new 創(chuàng)建的集合,不屬于不可變?AbstractImmutableList?類的子類辐烂,所以?copyOf?方法又創(chuàng)建了一個新的實例遏插,所以為false
3.JAVA原有的一些概念的清楚程度:
Diamond Problem:B & C are all inherit from A,and D inherit from both B & C.
很多問題都要想清楚了再回答纠修,這樣可以回答得很完整胳嘲;
4.為什么我們要用Lambda:
我們其實不需要匿名內(nèi)部類(或其依賴的接口),我們不需要這整個類或接口扣草,但我們其實只需要知道方法體里的內(nèi)容了牛;這就是Lambda誕生的原因颜屠,Lambda其實還是那個接口,但形式簡單鹰祸、且是函數(shù)式編程甫窟;那Lambda是否是也繼承了這個接口呢?
函數(shù)式編程區(qū)別于指定式編程蛙婴,它更在乎結(jié)果而不是過程粗井;很多指令式編程語言(比如Fortran、BASIC和C)是匯編語言的抽象化街图,匯編語言就是最底層化的語言浇衬;
Scheme式函數(shù)式編程早期的范本,Lazy Evaluation或call by need
5.