JDK10的新特性:var和匿名類

簡介

匿名類相信你們都用過了,學過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。博客

lambda表達式中的匿名類

咱們常常在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的博客

歡迎關注個人公衆號:程序那些事,更多精彩等着您!

相關文章
相關標籤/搜索