Java8一些變態(tài)的特性

引言

Java8里面增加了許多新特性。。。嗯,此處廢話?。。?/p>

Lambda表達式

函數(shù)式接口

要使用Lambda表達式,你一定要知道什么是函數(shù)式接口,那就是只有一個接口方法的接口。

例子 以Runnable接口舉例,就只有一個run的接口方法:

傳統(tǒng)寫法

new Thread(new Runnable() {
            
    @Override
    public void run() {
        System.out.println("傻逼");
    }
}).start();

Lambda函數(shù)式寫法

new Thread(() -> {
    System.out.println("傻逼");
}).start();

注意(lambda表達式三種表達形式)

  • (參數(shù))->單行語句
  • (參數(shù))->{多行語句}
  • (參數(shù))->表達式(PS:此處為返回值)

接口的非抽象方法

以前是這樣的,接口里面的方法都不能去實現(xiàn),Java8新特性打破了這個傳統(tǒng),嘿嘿。接口里面有些方法可以實現(xiàn)。

接口的默認方法

使用default關(guān)鍵字

接口的靜態(tài)方法

使用static關(guān)鍵字

小例子

下面這種寫法居然是可以的。。。

代碼


public class TestDemo {
    interface Test {
        default void printILU() {
            System.out.println("我愛你????");
        }
        
        static void printFck() {
            System.out.println("臥槽!??!");
        }
        
        void printNor();
    }
    
    public class TestImpl implements Test {
        
        @Override
        public void printNor() {
            System.out.println("我錘是正常的");
        }
        
    }
    
    public static void main(String[] args) {
        Test test = new TestDemo().new TestImpl();
        test.printILU();
        Test.printFck();
        test.printNor();
        
    }
    
}

輸出結(jié)果

我愛你????
我錘是正常的
臥槽?。?!

奇葩的枚舉

在很多語言中,枚舉僅僅是一些有限集合的語義化表示。有點別名的意思??墒荍ava8的枚舉可就奇葩啦,可以帶方法,帶構(gòu)造函數(shù)等等等等。。。。

枚舉與多例設(shè)計模式

代碼

下面代碼辣眼睛,請慎看。。。

enum Week {
    SunDay, MonDay, TuesDay, WednesDay, ThursDay, FriDay, SaturDay;
    public static Week getInstance(int ch) {
        switch (ch) {
            case 0:
                return SunDay;
            case 1:
                return MonDay;
            case 2:
                return TuesDay;
            case 3:
                return WednesDay;
            case 4:
                return ThursDay;
            case 5:
                return FriDay;
            case 6:
                return SaturDay;
            default:
                return null;
        }
    }
}

public class TestDemo {
    public static void main(String[] args) {
        for (int i = 0; i < 7; i++)
            System.out.println(Week.getInstance(i));
    }
}

輸出

SunDay
MonDay
TuesDay
WednesDay
ThursDay
FriDay
SaturDay

嗯哼?Java8的枚舉就是這么任性,可以添加靜態(tài)方法。

枚舉與類

上面的都是小case,讓你看看怎么在枚舉里面添加屬性跟構(gòu)造函數(shù)。。。假裝是一只類。。。

代碼

enum Color {
    RED("紅色"), GREEN("綠色"), BLUE("藍色"), DEFAULT("這是啥?");
    private String title;
    
    Color(String color) {
        this.title = color;
    }
    
    public String toString() {
        return this.title;
    }
    
    public static Color getInstance(int ch) {
        switch (ch) {
            case 1:
                return RED;
            case 2:
                return GREEN;
            case 3:
                return BLUE;
            default:
                return DEFAULT;
        }
    }
}

public class TestDemo {
    public static void main(String[] args) {
        for (int i = 0; i <= 3; i++)
            System.out.println(Color.getInstance(i));
    }
}

輸出

這是啥?
紅色
綠色
藍色

沒有看錯,這里的RED("紅色")直接就調(diào)用了構(gòu)造函數(shù),現(xiàn)在枚舉里面的都是一個一個的對象了。

枚舉與接口

繼續(xù)辣眼睛。。。枚舉還可以實現(xiàn)接口,其實從上面的例子中的特性就不難看出了吧。。。

代碼

interface IColor {
    public String getTitle();
}

enum ColorImpl implements IColor {
    RED("紅色"), GREEN("綠色"), BLUE("藍色"), DEFAULT("這是啥???");
    
    private String title;
    
    ColorImpl(String color) {
        this.title = color;
    }
    
    public String toString() {
        return this.title;
    }
    
    public String getTitle() {
        return this.title;
    }
    
    public static IColor getInstance(int ch) {
        switch (ch) {
            case 1:
                return RED;
            case 2:
                return GREEN;
            case 3:
                return BLUE;
            default:
                return DEFAULT;
        }
    }
    
}

public class Excise85 {
    public static void main(String[] args) {
        for (int i = 0; i <= 3; i++)
            System.out.println(ColorImpl.getInstance(i).getTitle());
    }
}

輸出

這是啥???
red
green
blue

枚舉與接口方法

是不是還不夠爽???效果跟上面相當,但是更加奇葩的寫法。。。下面有請!??!

代碼

interface IColor {
    public String getTitle();
}

enum ColorImpl implements IColor {
    RED("紅色") {
        public String getTitle() {
            return "RED:" + this;
        }
    },
    GREEN("綠色") {
        public String getTitle() {
            return "GREEN:" + this;
        }
    },
    BLUE("藍色") {
        public String getTitle() {
            return "BLUE:" + this;
        }
    },
    DEFAULT("這是啥???") {
        public String getTitle() {
            return "BLUE:" + this;
        }
    };
    
    private String title;
    
    ColorImpl(String color) {
        this.title = color;
    }
    
    public String toString() {
        return this.title;
    }
    
    public static IColor getInstance(int ch) {
        switch (ch) {
            case 1:
                return RED;
            case 2:
                return GREEN;
            case 3:
                return BLUE;
            default:
                return DEFAULT;
        }
    }
}

public class TestDemo {
    public static void main(String[] args) {
        for (int i = 0; i <= 3; i++)
            System.out.println(ColorImpl.getInstance(i).getTitle());
    }
}

上面實現(xiàn)了枚舉對象各自的getTitle方法

輸出

BLUE:這是啥???
RED:紅色
GREEN:綠色
BLUE:藍色

枚舉與抽象方法

看到這里是不是很無聊???我也寫得挺無聊的。。。不過為了完整,我選擇堅持?。。?br> 枚舉還能結(jié)合抽象方法,看代碼[哈欠][哈欠][哈欠]

代碼

enum Color {
    RED("red") {
        public String getTitle() {
            return "RED:" + this;
        }
    },
    GREEN("green") {
        public String getTitle() {
            return "GREEN:" + this;
        }
    },
    BLUE("blue") {
        public String getTitle() {
            return "BLUE:" + this;
        }
    };
    
    private String title;
    
    Color(String color) {
        this.title = color;
    }
    
    public String toString() {
        return this.title;
    }
    
    public static Color getInstance(int ch) {
        switch (ch) {
            case 1:
                return RED;
            case 2:
                return GREEN;
            case 3:
                return BLUE;
            default:
                return null;
        }
    }
    
    abstract public String getTitle();
}

public class TestDemo {
    public static void main(String[] args) {
        for (int i = 1; i <= 3; i++)
            System.out.println(Color.getInstance(i).getTitle());
    }
}

輸出

RED:red
GREEN:green
BLUE:blue

最后一個枚舉特性

騙你的,枚舉完了。O(∩_∩)O哈哈~

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

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

  • Java8 in action 沒有共享的可變數(shù)據(jù),將方法和函數(shù)即代碼傳遞給其他方法的能力就是我們平常所說的函數(shù)式...
    鐵牛很鐵閱讀 1,386評論 1 2
  • 簡介 概念 Lambda 表達式可以理解為簡潔地表示可傳遞的匿名函數(shù)的一種方式:它沒有名稱,但它有參數(shù)列表、函數(shù)主...
    劉滌生閱讀 3,364評論 5 18
  • 原文鏈接:https://github.com/EasyKotlin 值就是函數(shù),函數(shù)就是值。所有函數(shù)都消費函數(shù),...
    JackChen1024閱讀 6,366評論 1 17
  • 本文地址:http://www.itdecent.cn/p/dd24738d2b11 寫在前面: Java8已經(jīng)發(fā)...
    王子ives閱讀 1,177評論 0 1
  • 領(lǐng)導(dǎo) 工作中支持,鼓勵,幫助,化解人生困惑,給予人生事業(yè)方向的把持! 同事 朋友 成長的路上,有小伙伴們的陪伴,一...
    冰咋吃閱讀 348評論 0 1

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