摘要:在此基礎(chǔ)上又向前邁進(jìn)了一步局部變量類型推斷允許開發(fā)人員跳過局部變量的類型聲明局部變量是指在方法定義,初始化塊,循環(huán)和其它的如代碼塊,會(huì)推斷該局部變量的類型。
前言
之前面試的時(shí)候問了我是否了解JDK10的變化,一時(shí)回答不出來,所以只回答了JDK8中的函數(shù)式編程和流編程。今天看到這篇講JAVA10的文章,順便了解一下。
正文JAVA10的所有新特性請(qǐng)參考這里。在所有的JEP中,JEP-286在社區(qū)中引發(fā)了熱烈的討論。因此今天將介紹此特性。
什么是局部變量類型推斷在JAVA8中,我們可以將下面這樣使用的菱形運(yùn)算符:
List
轉(zhuǎn)化為:
Listdata = new ArrayList<>();
RHS上的類型通過LHS上的類型來推斷。
Java 10在此基礎(chǔ)上又向前邁進(jìn)了一步:
var data = new ArrayList<>();
局部變量類型推斷允許開發(fā)人員跳過局部變量的類型聲明(局部變量是指在方法定義,初始化塊,for循環(huán)和其它的如if-else代碼塊),JDK會(huì)推斷該局部變量的類型。
在哪里使用?下面我寫一個(gè)樣例代碼來展示使用局部變量推斷var的不同的方法:
public class LegalLocalVarInferenceDemo{ //在靜態(tài)或是實(shí)例化的代碼塊中 static { var anotherName = "Sanaulla"; System.out.println("Hello, " + anotherName); } public static void main(String[] args){ //局部變量 var name = "Mohamed Sanualla"; System.out.println("Hello " + name); var data = new ArrayList<>(); data.add(Map.of("key1", "value1", "key2", "value2")); data.add(Map.of("key11", "value11", "key22", "value22")); data.add("hello"); System.out.println(data); System.out.println("********** As iteration variable in enhanced for-loop ***************"); //for循環(huán)中 for ( var object : data){ System.out.println(String.format("%s of type %s", object, object.getClass().getName())); } System.out.println("********** As looping index in for-loop ***************"); //for循環(huán)中 for ( var i = 0 ; i < data.size(); i++ ){ var object = data.get(i); System.out.println(String.format("%s of type %s", object, object.getClass().getName())); } System.out.println("********** As a return value from another method ***************"); //另一個(gè)方法的返回值 var anInteger = someAnotherMethod(); System.out.println("someAnotherMethod returned " + anInteger); } //As a return value in a method public static Integer someAnotherMethod(){ System.out.println("someAnotherMethod called"); var returnObj = 12; return returnObj; } }何時(shí)不能使用?
public class IllegalLocalVarInferenceDemo{ //不準(zhǔn)聲明實(shí)例變量 //var someProperty; //不準(zhǔn)作為構(gòu)造器的參數(shù) // public LocalVarInferenceDemo(var param1){ // } public static void main(String[] args){ //不準(zhǔn)被catch塊捕獲 // try{ // //some operations // }catch(var ex){ // } } //不準(zhǔn)作為方法聲明的參數(shù) //public static void someMethod(var param1, var param2){ // System.out.println("Some method called"); //} //不準(zhǔn)作為方法的返回值 // public static var someAnotherMethod2(){ // System.out.println("someAnotherMethod called"); // var returnObj = 12; // return returnObj; // } }補(bǔ)充官網(wǎng)上的例子
Main.java:81: error: cannot infer type for local variable x var x; ^ (cannot use "val" on variable without initializer) Main.java:82: error: cannot infer type for local variable f var f = () -> { }; ^ (lambda expression needs an explicit target-type) Main.java:83: error: cannot infer type for local variable g var g = null; ^ (variable initializer is "null") Main.java:84: error: cannot infer type for local variable c var c = l(); ^ (inferred type is non denotable) Main.java:195: error: cannot infer type for local variable m var m = this::l; ^ (method reference needs an explicit target-type) Main.java:199: error: cannot infer type for local variable k var k = { 1 , 2 }; ^ (array initializer needs an explicit target-type)參考資料
JRE-286
想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/68716.html
摘要:目標(biāo)發(fā)布目前有兩個(gè)主要功能針對(duì)局部變量類型推斷這將刪除大部分對(duì)象實(shí)例化所需的冗長的包含手動(dòng)類型信息整合源樹的庫即不同的庫將被合并成一個(gè)單一的存儲(chǔ)庫。特別是,承諾為局部變量實(shí)例化引入類型推斷機(jī)制,并將現(xiàn)有的存儲(chǔ)庫合并到一個(gè)存儲(chǔ)庫中。 JDK 10 何時(shí)發(fā)布? JDK 10 是 Java 10 標(biāo)準(zhǔn)版的部分實(shí)現(xiàn),將于 2018 年 3 月 20 日發(fā)布,改進(jìn)的關(guān)鍵點(diǎn)包括一個(gè)本地類型推斷、一...
摘要:在月日正式發(fā)布,同時(shí)宣布將新版本的發(fā)布周期調(diào)整為每半年一次。目前,新版本的開發(fā)也已正式進(jìn)入軌道。提議在中引入局部變量的類型推斷,該在年提出,曾經(jīng)報(bào)道過該的概況和相關(guān)的開發(fā)者調(diào)查結(jié)果。它會(huì)減少開發(fā)人員在聲明局部變量時(shí),沒有必要的變量類型聲明。 Java 9在9月21日正式發(fā)布,同時(shí)Oracle宣布將Java新版本的發(fā)布周期調(diào)整為每半年一次。目前,Java新版本的開發(fā)也已正式進(jìn)入軌道。就已...
摘要:的問題在于,版本號(hào)中編碼了它和它對(duì)之前版本的兼容性信息。但是在六個(gè)月節(jié)奏的情況下,這些信息都是未知的,在發(fā)布前任何事情都可能發(fā)生,由此規(guī)范下的版本號(hào)也會(huì)是未知的。程序會(huì)對(duì)文件的完整性做一個(gè)保護(hù),因此修改既可能丟失。 本文是對(duì)底部參考資料的整理得到的,由于本人技術(shù)水平和英語水平都不是很高,有些詞如有翻譯錯(cuò)誤或句子的理解錯(cuò)誤還請(qǐng)指出。 JEP 286 局部變量推斷: var 傳統(tǒng)的 J...
摘要:的新特性說了這么多,看都會(huì)有哪些特性來改變我們寫代碼的方式呢局部變量類型推斷局部變量類型推斷可以說是中最值得注意的特性,這是語言開發(fā)人員為了簡化應(yīng)用程序的編寫而采取的又一步,如下圖所示。 showImg(https://segmentfault.com/img/remote/1460000015356980); Java 9才發(fā)布幾個(gè)月,很多玩意都沒整明白,現(xiàn)在Java 10又快要來了...
摘要:實(shí)際上并未引入太多新特性,不過有一個(gè)新特性最引人注目等了這么久終于支持類型推斷了,那么今天就來看一看的類型推斷,和其他語言相比有哪些異同吧。本次更新也支持了類型推斷,對(duì)于這種重量級(jí)語言來說還是一件值得高興的事。 0x01 Java 10簡介 自從有了校內(nèi)的下載網(wǎng)站,很少上Oracle官網(wǎng)下載JDK了,結(jié)果前兩天聽鐘神說Java 10都出來了2333。干IT這行還真是要與時(shí)俱進(jìn)啊,那就...
閱讀 774·2021-11-22 13:54
閱讀 3183·2021-09-26 10:16
閱讀 3606·2021-09-08 09:35
閱讀 1643·2019-08-30 15:55
閱讀 3488·2019-08-30 15:54
閱讀 2144·2019-08-30 10:57
閱讀 550·2019-08-29 16:25
閱讀 934·2019-08-29 16:15