Java8一些变态的特性

引言

Java8里面增加了许多新特性。。。嗯,此处废话!!!

Lambda表达式

函数式接口

要使用Lambda表达式,你一定要知道什么是函数式接口,那就是只有一个接口方法的接口

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

传统写法

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

Lambda函数式写法

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

注意(lambda表达式三种表达形式)

  • (参数)->单行语句
  • (参数)->{多行语句}
  • (参数)->表达式(PS:此处为返回值)

接口的非抽象方法

以前是这样的,接口里面的方法都不能去实现,Java8新特性打破了这个传统,嘿嘿。接口里面有些方法可以实现。

接口的默认方法

使用default关键字

接口的静态方法

使用static关键字

小例子

下面这种写法居然是可以的。。。

代码


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();
        
    }
    
}

输出结果

我爱你????
我锤是正常的
卧槽!!!

奇葩的枚举

在很多语言中,枚举仅仅是一些有限集合的语义化表示。有点别名的意思。可是Java8的枚举可就奇葩啦,可以带方法,带构造函数等等等等。。。。

枚举与多例设计模式

代码

下面代码辣眼睛,请慎看。。。

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的枚举就是这么任性,可以添加静态方法。

枚举与类

上面的都是小case,让你看看怎么在枚举里面添加属性跟构造函数。。。假装是一只类。。。

代码

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("红色")直接就调用了构造函数,现在枚举里面的都是一个一个的对象了。

枚举与接口

继续辣眼睛。。。枚举还可以实现接口,其实从上面的例子中的特性就不难看出了吧。。。

代码

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());
    }
}

上面实现了枚举对象各自的getTitle方法

输出

BLUE:这是啥???
RED:红色
GREEN:绿色
BLUE:蓝色

枚举与抽象方法

看到这里是不是很无聊???我也写得挺无聊的。。。不过为了完整,我选择坚持!!!
枚举还能结合抽象方法,看代码[哈欠][哈欠][哈欠]

代码

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哈哈~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • Java8 in action 没有共享的可变数据,将方法和函数即代码传递给其他方法的能力就是我们平常所说的函数式...
    铁牛很铁阅读 1,223评论 1 2
  • 简介 概念 Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主...
    刘涤生阅读 3,198评论 5 18
  • 原文链接:https://github.com/EasyKotlin 值就是函数,函数就是值。所有函数都消费函数,...
    JackChen1024阅读 5,962评论 1 17
  • 本文地址:http://www.jianshu.com/p/dd24738d2b11 写在前面: Java8已经发...
    王子ives阅读 1,081评论 0 1
  • 领导 工作中支持,鼓励,帮助,化解人生困惑,给予人生事业方向的把持! 同事 朋友 成长的路上,有小伙伴们的陪伴,一...
    冰咋吃阅读 292评论 0 1