摘要:就等于局部變量類型推斷使用示例既然叫局部變量類型推斷,以只能用在局部變量中,下面給出更多使用示例。,本次局部變量類型推斷實(shí)戰(zhàn)文章就到這里了,后續(xù)帶來更多的的實(shí)戰(zhàn)方面的文章。
現(xiàn)在 Java 9 被遺棄了直接升級(jí)到了 Java 10,之前也發(fā)過 Java 10 新特性的文章,現(xiàn)在是開始實(shí)戰(zhàn) Java 10 的時(shí)候了。
今天要實(shí)戰(zhàn)的是 Java 10 中最重要的特性:局部變量類型推斷,大家都知道是 var 關(guān)鍵字,但具體怎么使用,及要注意什么要點(diǎn)呢?
我們通過幾個(gè)例子來講解局部變量類型推斷這個(gè)新特性!
什么是局部變量類型推斷var javastack = "javastack"; System.out.println(javastack);
大家看出來了,局部變量類型推斷就是左邊的類型直接使用 var 定義,而不用寫具體的類型,編譯器能根據(jù)右邊的表達(dá)式自動(dòng)推斷類型,如上面的 String 。
var javastack = "javastack";
就等于:
String javastack = "javastack";局部變量類型推斷使用示例
既然叫局部變量類型推斷,以只能用在局部變量中,下面給出更多使用示例。
1、字面量定義局部變量
private static void testVar() { var javastack = "javastack"; System.out.println(javastack); }
2、接收方法返回值定義局部變量
private static void testMethod() { var javastack = getJavastack(); System.out.println(javastack); } public static String getJavastack() { return "javastack"; }
3、循環(huán)中定義局部變量
private static void testLoop() { for (var i = 0; i < 3; i++) { for (var m = 10; m < 15; m++) { System.out.println(i + m); } } }
4、泛型結(jié)合局部變量
private static void testGeneric() { // 表達(dá)式1 Listlist1 = new ArrayList<>(); list1.add("javastack"); // 表達(dá)式2 var list2 = new ArrayList<>(); list2.add(2018); // 表達(dá)式3 var list3 = new ArrayList (); list3.add("javastack"); }
表達(dá)式1后面 <> 里面 jdk 1.7+開始是不用帶具體類型的,在接口中指明就行了。
表達(dá)式2中如果使用 var 的話,<> 里面默認(rèn)會(huì)是 Object 的,所以可以添加任意類型。
表達(dá)式3中在 <> 強(qiáng)制使用了 String 來指定泛型。
局部變量類型推斷不能用在以下場(chǎng)景1、類成員變量類型
// 編譯報(bào)錯(cuò) private var javastack = "Java技術(shù)棧";
2、方法返回類型
/** * 編譯報(bào)錯(cuò) * @return */ public static var getJavastack(){ return "Java技術(shù)棧"; }
3、Lambda 表達(dá)式
private static void testLambda() { Runnable runnable = () -> System.out.println("javastack"); // 編譯報(bào)錯(cuò) // var runnable = () -> System.out.println("javastack"); }
以上 3 種場(chǎng)景是肯定不能使用 var 的,其他場(chǎng)合有待驗(yàn)證。
局部變量類型推斷優(yōu)缺點(diǎn)優(yōu)點(diǎn):簡(jiǎn)化代碼
CopyOnWriteArrayList list1 = new CopyOnWriteArrayList(); ConcurrentModificationException cme1 = new ConcurrentModificationException(); DefaultServiceUnavailableRetryStrategy strategy1 = new DefaultServiceUnavailableRetryStrategy(); var list2 = new CopyOnWriteArrayList<>(); var cme2 = new ConcurrentModificationException(); var strategy2 = new DefaultServiceUnavailableRetryStrategy();
從以上代碼可以看出,很長(zhǎng)的定義類型會(huì)顯得代碼很冗長(zhǎng),使用 var 大大簡(jiǎn)化了代碼編寫,同時(shí)類型統(tǒng)一顯得代碼很對(duì)齊。
缺點(diǎn):掩蓋類型
var token = new JsonParserDelegate(parser).currentToken();
看以上代碼,不進(jìn)去看返回結(jié)果類型,誰知道返回的類型是什么?所以這種情況最好別使用 var,而使用具體的抽象類、接口或者實(shí)例類型。
var關(guān)鍵字原理var其實(shí)就是 Java 10 增加的一種語法糖而已,在編譯期間會(huì)自動(dòng)推斷實(shí)際類型,其編譯后的字節(jié)碼和實(shí)際類型一致,如以下例子所示。
private static void testByteCode() { String javastack1 = "javastack"; var javastack2 = "javastack"; }
編譯成字節(jié)碼后:
private static testByteCode()V L0 LINENUMBER 22 L0 LDC "javastack" ASTORE 0 L1 LINENUMBER 23 L1 LDC "javastack" ASTORE 1 L2 LINENUMBER 24 L2 RETURN L3 LOCALVARIABLE javastack1 Ljava/lang/String; L1 L3 0 LOCALVARIABLE javastack2 Ljava/lang/String; L2 L3 1 MAXSTACK = 1 MAXLOCALS = 2
可以看出 javastack1 和 javastack2 都是虛擬機(jī)所認(rèn)識(shí)的的本地變量類型:java.lang.String,虛擬機(jī)并不認(rèn)識(shí) var, 所以 var 并不神奇。
OK,本次 Java 10 局部變量類型推斷實(shí)戰(zhàn)文章就到這里了,后續(xù)帶來更多的 Java 10 的實(shí)戰(zhàn)方面的文章。
推薦:Spring Boot & Cloud 最強(qiáng)技術(shù)教程
掃描關(guān)注我們的微信公眾號(hào),干貨每天更新。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/71130.html
摘要:美國時(shí)間月日,正式發(fā)布了,這是據(jù)以后支持的首個(gè)長(zhǎng)期版本。加強(qiáng)是中的新特性,開始對(duì)增加了以下個(gè)新方法。結(jié)束語現(xiàn)在許多人還在使用或者,不過在年初就會(huì)結(jié)束免費(fèi)更新。 美國時(shí)間 09 月 25 日,Oralce 正式發(fā)布了 Java 11,這是據(jù) Java 8 以后支持的首個(gè)長(zhǎng)期版本。 為什么說是長(zhǎng)期版本,看下面的官方發(fā)布的支持路線圖表。 showImg(https://segmentfaul...
摘要:上下文比如,接受它傳遞的方法的參數(shù),或者接受它的值得局部變量中表達(dá)式需要類型稱為目標(biāo)類型。但局部變量必須顯示的聲明,或?qū)嶋H上就算。換句話說,表達(dá)式只能捕獲指派給它們的局部變量一次。注捕獲實(shí)例變量可以被看作捕獲最終局部變量。 由于第三章的內(nèi)容比較多,而且為了讓大家更好的了解Lambda表達(dá)式的使用,也寫了一些相關(guān)的實(shí)例,可以在Github或者碼云上拉取讀書筆記的代碼進(jìn)行參考。 類型檢查、...
摘要:使用表達(dá)式,使得應(yīng)用變得簡(jiǎn)潔而緊湊。很多語言等從設(shè)計(jì)之初就支持表達(dá)式。表達(dá)式的參數(shù)與函數(shù)式接口內(nèi)方法的參數(shù),返回值類型相互對(duì)應(yīng)。更多教程和資料請(qǐng)上騰訊課堂樂字節(jié) showImg(https://segmentfault.com/img/bVbtotg?w=935&h=345); Java8 引入Lambda表達(dá)式,允許開發(fā)者將函數(shù)當(dāng)成參數(shù)傳遞給某個(gè)方法,或者把代碼本身當(dāng)作數(shù)據(jù)進(jìn)行處理。...
摘要:目標(biāo)發(fā)布目前有兩個(gè)主要功能針對(duì)局部變量類型推斷這將刪除大部分對(duì)象實(shí)例化所需的冗長(zhǎng)的包含手動(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è)本地類型推斷、一...
摘要:的新特性說了這么多,看都會(huì)有哪些特性來改變我們寫代碼的方式呢局部變量類型推斷局部變量類型推斷可以說是中最值得注意的特性,這是語言開發(fā)人員為了簡(jiǎn)化應(yīng)用程序的編寫而采取的又一步,如下圖所示。 showImg(https://segmentfault.com/img/remote/1460000015356980); Java 9才發(fā)布幾個(gè)月,很多玩意都沒整明白,現(xiàn)在Java 10又快要來了...
閱讀 1907·2021-11-23 09:51
閱讀 1550·2021-11-19 09:40
閱讀 3223·2021-11-11 11:01
閱讀 1122·2021-09-27 13:34
閱讀 1854·2021-09-22 15:56
閱讀 2138·2019-08-30 15:52
閱讀 1074·2019-08-30 14:13
閱讀 3487·2019-08-30 14:10