匿名類相信你們都用過了,學過JDK8中的lambda表達式以後,能夠發現有些匿名類是能夠用lambda表達式來替代的,可以被替代的類叫作funcational interface。java
具體的有關lambda表達式和匿名類的介紹,你們能夠查閱我以前寫的文章。這裏就很少講了。git
本文主要介紹var和匿名類之間的一些平時沒有注意到的問題。github
更多內容請訪問 www.flydean.com
咱們看一個常常使用的Runnable匿名類:ide
Runnable runnable = new Runnable() { String className=Thread.currentThread().getName(); @Override public void run() { log.info("inside runnable"); } };
和日常使用的Runable不同的是,咱們爲匿名類添加了一個變量叫作className。code
由於Runnable接口並無定義如何去訪問這個新建立的className字段,因此使用runnable.className是會編譯錯誤的。接口
可是若是咱們將Runnable替換成爲var:get
var runnable = new Runnable() { String className=Thread.currentThread().getName(); @Override public void run() { log.info("inside runnable"); } }; log.info(runnable.className);
能夠看到神奇的事情發生了,var變量能夠訪問到className。博客
咱們常常在Stream的遍歷和處理中使用lambda表達式,可是可能不多有人在lambda表達式中使用匿名類。it
不要緊,下面咱們再舉個例子:io
List<Object> objects=Stream.of(1,2,3,4).map(i-> new Object(){ int count=i; }).filter(o -> o.count >0) .collect(Collectors.toList()); log.info("{}",objects);
上面的例子中,咱們建立了一個stream,在map的過程當中返回了新建立的匿名Object,在匿名Object內部咱們定義了一個叫作count的變量。
注意在接下來的filter中,咱們其實是能夠直接使用map中建立的Object,而且能夠直接訪問其新定義的count變量。
本文講解了var變量中一些鮮爲人知的小技巧,同時介紹了在lambda表達式中的匿名類的使用,但願你們可以喜歡。
本文的例子[https://github.com/ddean2009/
learn-java-base-9-to-20](https://github.com/
ddean2009/learn-java-base-9-to-20)
本文做者:flydean程序那些事本文連接:http://www.flydean.com/jdk10-var-anonymous-class/
本文來源:flydean的博客
歡迎關注個人公衆號:程序那些事,更多精彩等着您!