JDK10新特性之本地變量類型var的深入理解
簡(jiǎn)介
java以面向?qū)ο蟮奶匦燥@著于世并得到了蓬勃的發(fā)展。在語(yǔ)言的發(fā)展過程中,為了讓java語(yǔ)言更加簡(jiǎn)潔和方便使用,JDK也在不斷的進(jìn)行改進(jìn)。
今天本文將要介紹一下JDK10中引入的本地變量類型var。
為什么我們需要var
類型推斷是很多編程語(yǔ)言都具有的特性,編譯器可以在我們不指定具體變量類型的情況下推斷出該變量的實(shí)際類型。
類型推斷的出現(xiàn),可以讓程序員的代碼更加靈活,利于維護(hù)和編寫。其實(shí)我們一直都有使用到類型推斷。
JDK8中引入的lambda表達(dá)式就是類型推斷的一個(gè)非常有用的例子:
int maxWeight = blocks.stream().filter(b -> b.getColor() == BLUE).mapToInt(Block::getWeight) .max();
上面的例子中blocks是一個(gè)Stream<Block>類型,在filter中使用到的b實(shí)際上就沒有指定其類型,它的類型是從Stream中推斷出來的。
再看一個(gè)線程池的例子:
ExecutorService executorService= Executors.newSingleThreadExecutor();
Runnable runnable=new Runnable() {
@Override
public void run() {
log.info("inside runnable");
}
};
executorService.submit(runnable);
很多時(shí)候,我們從變量的名字就已經(jīng)知道了這個(gè)變量到底是什么類型的,那么上面的例子如果用var來改寫就可以像這樣:
var executorService= Executors.newSingleThreadExecutor();
var runnable=new Runnable() {
@Override
public void run() {
log.info("inside runnable");
}
};
executorService.submit(runnable);
代碼更加簡(jiǎn)潔,程序員寫起來也更加方便。
如果上面的例子還不能夠提起你使用var的興趣,那么下面的例子你一定很樂意使用var了。
假如我們有一個(gè)非常非常長(zhǎng)的類名:
ItIsAVeryLongNameJavaClass itIsAVeryLongNameJavaClass= new ItIsAVeryLongNameJavaClass();
寫起來是不是超級(jí)麻煩,代碼看起也非常冗余,這時(shí)候我們就可以將其簡(jiǎn)化為:
var itIsAVeryLongNameJavaClass= new ItIsAVeryLongNameJavaClass();
var使用在什么地方
首先var代表的是本地變量,所以,只有本地變量才能夠使用var。
其次var在定義的時(shí)候就必須被初始化:
var a; //Invalid Declaration - - Cannot use 'var' on variable without initializer var a = 100; //Valid Declaration
var可以用在for loop中:
for ( var element : elementList){
//do something for element
}
或者這種:
for ( var i = 0 ; i < elementList.size(); i++ ){
System.out.println( elementList.get(i) );
}
var不能用在什么地方
因?yàn)関ar是本地變量類型,它不能用在類變量的定義中,不能用在方法變量中,不能用在構(gòu)造函數(shù)中,不能用在方法返回中,不能用在catch變量定義中。
public class VarIncorrectUsage {
//var user; //Not allowed as class fields
//public VarIncorrectUsage(var param){ //Not allowed as parameter
//}
/*try{
} catch(var exception){ //Not allowed as catch formal
}*/
/*public var returnMethod(){ //Not allowed in method return type
return null;
}*/
/*public Integer parameterMethod( var input ){ //Not allowed in method parameters
return null;
}*/
}
注意,var在JVM無法推斷其類型或者可以有很多類型的情況下不能夠使用:
var ints = {1, 2, 3};
var lambda = a -> a;
var methodReference = String::concat;
上面例子中數(shù)組初始化,lambda表達(dá)式和方法引用都是不能用var的。
其他var的特點(diǎn)
var不是關(guān)鍵字,所以我們可以使用var來做變量名字:
var var = 2; //Valid Declaration
int var = 2; //Also valid Declaration
因?yàn)関ar是JDK10引入的概念,所以不是向下兼容的。不能夠用低版本的編譯器來編譯var。
var不會(huì)影響性能,因?yàn)関ar是在代碼編譯器進(jìn)行的類型推斷,所以并不會(huì)影響到性能。
本文的例子[https://github.com/ddean2009/
learn-java-base-9-to-20](https://github.com/ddean2009/...
總結(jié)
var是JDK10中引入的一個(gè)新的特性,希望大家可以喜歡。
到此這篇關(guān)于JDK10新特性之本地變量類型var的文章就介紹到這了,更多相關(guān)JDK10新特性之本地變量類型var內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring 實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫分離的示例
現(xiàn)在大型的電子商務(wù)系統(tǒng),在數(shù)據(jù)庫(kù)層面大都采用讀寫分離技術(shù),我們通常的做法就是把查詢從主庫(kù)中抽取出來,采用多個(gè)從庫(kù),使用負(fù)載均衡,減輕每個(gè)從庫(kù)的查詢壓力。2017-01-01
詳解spring security四種實(shí)現(xiàn)方式
這篇文章主要介紹了詳解spring security四種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java創(chuàng)建型設(shè)計(jì)模式之工廠方法模式深入詳解
工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計(jì)模式,此模式的核心精神是封裝類中變化的部分,提取其中個(gè)性化善變的部分為獨(dú)立類,通過依賴注入以達(dá)到解耦、復(fù)用和方便后期維護(hù)拓展的目的。它的核心結(jié)構(gòu)有四個(gè)角色,分別是抽象工廠、具體工廠、抽象產(chǎn)品、具體產(chǎn)品2022-09-09
TransmittableThreadLocal通過javaAgent實(shí)現(xiàn)線程傳遞并支持ForkJoin
這篇文章主要介紹了TransmittableThreadLocal通過javaAgent實(shí)現(xiàn)線程傳遞并支持ForkJoin詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Mybatis動(dòng)態(tài)Sql標(biāo)簽使用小結(jié)
本文主要介紹了Mybatis動(dòng)態(tài)Sql標(biāo)簽使用,常用的動(dòng)態(tài)sql標(biāo)簽包括?if、choose(when、otherwise)、trim(where、set)、foreach,下面就來介紹一下2024-04-04
Spring中@Repository注解的作用和用法以及和@Mapper的區(qū)別詳析
這篇文章主要給大家介紹了關(guān)于Spring中@Repository注解的作用和用法以及和@Mapper的區(qū)別的相關(guān)資料,注解的作用是標(biāo)識(shí)一個(gè)類為數(shù)據(jù)訪問對(duì)象,并由Spring框架進(jìn)行實(shí)例化和管理,需要的朋友可以參考下2023-09-09
Java無界阻塞隊(duì)列DelayQueue詳細(xì)解析
這篇文章主要介紹了Java無界阻塞隊(duì)列DelayQueue詳細(xì)解析,DelayQueue是一個(gè)支持時(shí)延獲取元素的無界阻塞隊(duì)列,隊(duì)列使用PriorityQueue來實(shí)現(xiàn),隊(duì)列中的元素必須實(shí)現(xiàn)Delayed接口,在創(chuàng)建元素時(shí)可以指定多久才能從隊(duì)列中獲取當(dāng)前元素,需要的朋友可以參考下2023-12-12

