Lamda表達式實現(xiàn)接口

轉(zhuǎn)載于:https://blog.csdn.net/qq_42628989/article/details/105297717

Lamda作為Java8引入的語法,不會的話也不影響我們的正常開發(fā),但如果學會的話,可以極大地減少我們的無用代碼數(shù)量,讓我們一起來看一下!

1.Lamda表達式常用情景:實現(xiàn)Runnbale接口創(chuàng)建線程

我們經(jīng)??梢栽诰幊讨锌吹饺缦麓a:

public class test {

    public static void main(String[] args) {

        Thread thread = new Thread(()-> {/某耗費時間的代碼/});
        thread.start();
    }
}

這其實就是我們Lamda表達式的使用方式之一:快速創(chuàng)建匿名類
如果我們不使用Lamda表達式,當然也可以實現(xiàn)相同的功能,不過,要花費的固定格式的代碼就要多很多。

比如:

public class test {

    public static void main(String[] args) {

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                /耗費時間的代碼/
            }
        });
        thread.start();
    }
}

可以看到,如果實現(xiàn)接口,要將實現(xiàn)接口的固定格式全部寫出(接口名方法名等),而Lamda則可以使用一行代碼搞定,極大簡化我們的代碼,看起來不會亂糟糟~

2.Lamda表達式的使用

Lamda表達式的基本格式:()->{}
其中()括號內(nèi)填寫的是方法的參數(shù),{}大括號內(nèi)填寫的是方法實現(xiàn)語句

舉例說明:實現(xiàn)Runnable接口,就可以這樣來寫

public class test {
    public static void main(String[] args) {
        Runnable myRunnable = () -> {
            for(int i=0;i<100;i++)
            {
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }; 

    }
}

因為run方法沒有參數(shù),所以并不需要在括號內(nèi)填寫參數(shù)。

現(xiàn)在來舉個例子模擬有參數(shù)的情況:

現(xiàn)在我們創(chuàng)建一個IEat接口,其中有一個eat方法,還有一個PersonEat方法,使用到了該接口的抽象方法,方法中內(nèi)容需要我們自己實現(xiàn),參數(shù)為eat的內(nèi)容!

public class test {
    //此方法調(diào)用了IEat接口中的eat方法
    public static void personEat(IEat e)
    {
        e.eat("蔬菜");
    }
    public static void main(String[] args) {
        IEat e = new IEat() {
            @Override
            public void eat(String v) {
                System.out.println("正在吃"+v);
            }
        };
        personEat(e);
    }
}
interface IEat
{
    void eat(String v);
}

以上就是我們通過匿名類實現(xiàn)接口并使用的例子,可以發(fā)現(xiàn),我們寫了很多的不必要內(nèi)容,來實現(xiàn)eat方法!

而使用我們Lamda表達式就很方便:

public class test {
    //此方法調(diào)用了IEat接口中的eat方法
    public static void personEat(IEat e)
    {
        e.eat("蔬菜");
    }
    public static void main(String[] args) {
        IEat e = (String v) -> {System.out.println("正在吃" + v);};
        personEat(e);
    }
}
interface IEat
{
    void eat(String v);
}

此時就可以發(fā)現(xiàn),我們化簡了很多規(guī)定格式的代碼,使項目更加簡潔,省掉了很多不必要的內(nèi)容!

變式寫法:

1.我們在此基礎上,還可以去參數(shù)類型

IEat e = (v) -> {System.out.println("正在吃" + v);};

2.除了去掉參數(shù)類型 ,如果只有一個參數(shù),還可以去掉括號

IEat e = v -> {System.out.println("正在吃" + v);};

3.如果實現(xiàn)方法的代碼只有一條,連大括號都可以去掉

IEat e = v -> System.out.println("正在吃" + v);

4.如果在想懶一下,我們甚至可以直接將Lamda表達式直接寫入到參數(shù)內(nèi)

personEat(v -> System.out.println("正在吃" + v));

寫到這個時候我們就可以很明顯發(fā)現(xiàn),我們(畫紅框)7行代碼,使用Lamda表達式之后,只需要一行代碼就可以搞定!


此時如果有人問:

方法沒有參數(shù)怎么辦?

public class test {

    //此方法調(diào)用了IEat接口中的eat方法
    public static void personEat(IEat e)
    {
        e.eat();
    }
    public static void main(String[] args) {
        //直接使用空括號就可以了
        personEat(() -> System.out.println("正在吃蔬菜"));
    }
}
interface IEat
{
    //沒有參數(shù)
    void eat();
}

有返回值怎么辦?

public class test {

    //此方法調(diào)用了IEat接口中的eat方法
    public static void personEat(IEat e)
    {
        //輸出處理結(jié)果
        System.out.println(e.eat("蔬菜"));
    }

    public static void main(String[] args) {
        //對字符串進行處理
        personEat(v -> "正在吃" + v);
    }
}

interface IEat
{
    //返回字符串
    String eat(String v);
}

總結(jié)來說:Lamda表達式是對抽象方法的快速實現(xiàn),并且為了追求效率,編譯器會根據(jù)接口定義自動推斷參數(shù)類型和返回值,所以,都可以進行省略,不會報錯!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容