java以面向對象的特性顯著於世並獲得了蓬勃的發展。在語言的發展過程當中,爲了讓java語言更加簡潔和方便使用,JDK也在不斷的進行改進。java
今天本文將要介紹一下JDK10中引入的本地變量類型var。git
類型推斷是不少編程語言都具備的特性,編譯器能夠在咱們不指定具體變量類型的狀況下推斷出該變量的實際類型。程序員
類型推斷的出現,可讓程序員的代碼更加靈活,利於維護和編寫。其實咱們一直都有使用到類型推斷。github
更多內容請訪問 www.flydean.com
JDK8中引入的lambda表達式就是類型推斷的一個很是有用的例子:編程
int maxWeight = blocks.stream().filter(b -> b.getColor() == BLUE).mapToInt(Block::getWeight) .max();
上面的例子中blocks是一個Stream<Block>類型,在filter中使用到的b實際上就沒有指定其類型,它的類型是從Stream中推斷出來的。數組
再看一個線程池的例子:編程語言
ExecutorService executorService= Executors.newSingleThreadExecutor(); Runnable runnable=new Runnable() { @Override public void run() { log.info("inside runnable"); } }; executorService.submit(runnable);
不少時候,咱們從變量的名字就已經知道了這個變量究竟是什麼類型的,那麼上面的例子若是用var來改寫就能夠像這樣:ide
var executorService= Executors.newSingleThreadExecutor(); var runnable=new Runnable() { @Override public void run() { log.info("inside runnable"); } }; executorService.submit(runnable);
代碼更加簡潔,程序員寫起來也更加方便。函數
若是上面的例子還不可以提起你使用var的興趣,那麼下面的例子你必定很樂意使用var了。oop
假如咱們有一個很是很是長的類名:
ItIsAVeryLongNameJavaClass itIsAVeryLongNameJavaClass= new ItIsAVeryLongNameJavaClass();
寫起來是否是超級麻煩,代碼看起也很是冗餘,這時候咱們就能夠將其簡化爲:
var itIsAVeryLongNameJavaClass= new ItIsAVeryLongNameJavaClass();
首先var表明的是本地變量,因此,只有本地變量纔可以使用var。
其次var在定義的時候就必須被初始化:
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是本地變量類型,它不能用在類變量的定義中,不能用在方法變量中,不能用在構造函數中,不能用在方法返回中,不能用在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;
上面例子中數組初始化,lambda表達式和方法引用都是不能用var的。
var不是關鍵字,因此咱們能夠使用var來作變量名字:
var var = 2; //Valid Declaration int var = 2; //Also valid Declaration
由於var是JDK10引入的概念,因此不是向下兼容的。不可以用低版本的編譯器來編譯var。
var不會影響性能,由於var是在代碼編譯器進行的類型推斷,因此並不會影響到性能。
var是JDK10中引入的一個新的特性,但願你們能夠喜歡。
本文的例子[https://github.com/ddean2009/
learn-java-base-9-to-20](https://github.com/ddean2009/...
本文做者:flydean程序那些事本文連接:http://www.flydean.com/jdk10-var-local-variable/
本文來源:flydean的博客
歡迎關注個人公衆號:程序那些事,更多精彩等着您!