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