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