美文网首页程序员
Java8一些变态的特性

Java8一些变态的特性

作者: Android开发哥 | 来源:发表于2017-02-26 14:19 被阅读142次

引言

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

相关文章

网友评论

    本文标题:Java8一些变态的特性

    本文链接:https://www.haomeiwen.com/subject/gfbowttx.html