本章主要介绍Java自1.5以来的几个新特性例如:枚举、注解、Lambda表达式等等
1)枚举
枚举类型的出现时Java 5新增的特性,从形式上看更像是一个特殊的类
01问题的引入
当我们在解决这样一个问题是如果要定义一组颜色的类,我们通常这样做定义一个类Color为这个类添加static final的属性各种颜色,为了使用这些颜色,或者通过类名去调用或者在类中添加构造器等等一系列基础操作。但是当你做完这一切发现少一个或者多个颜色,如果需要修改的话就得修改源代码,这显然违反了Java的开闭规则。而且代码量十分恐怖,如果几百个颜色或者数据
02问题的解决方式
一个特殊类Enum类的出现
enum Color{
RED,GREEN,BULE
}
简介明了 懒是程序员进步的阶梯 极大程度上缩减工作量
- 用法:常量
public enum Color{
RED,GREEN,BLANK
}
- switch
enum Signal{
GREEN,YELLOW,RED
}
public class test{
Signal color = Signal.RED;
public void change(){
switch(color){
case RED:
color = Signal.GREEN;
break;
case YEELOW:
color = Signal.RED;
break;
}
}
}
- 枚举类的方法
1.构造方法
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
2.获得枚举名字
public final String name() {
return name;
}
3 取得枚举序号
private final int ordinal;
2)注解
注解使用的标记 @ 为程序添加某种标记,方便程序员与编译器对程序的读取,减少因为语义不明引起的错误;
- 覆写
@Override
标记方法的复写 通常在继承关系中,子类会对父类方法名称相同、参数列表相同、返回值类型相同的方法覆写,被覆写的方法不能比父类的权限更加严格。
避免在使用子类对方法调用时不知道调的是子类还是父类的方法 - 声明过期
@Deprecated
标记一个方法现在在用可能以后不会使用,或者老版本能用新版本不能用 - @SuppressWarnings
对程序弹出的问题会产生警告,不想看到这个警告所以压制警告。
3)Lambda表达式
Lambda表达式是 JDK 1.8传入的重要新的特性,函数是编程。
传统的面向对象开发在解决方法问题是遵循对象调用原则
interface IMessage{
void test();
}
public class test{
public static void main(String[] args){
IMessage message = new IMessage(){
@Override
public void test(){
System.out.println("测试");
}
}
}
}
当我们使用接口来实现方法问题 一般都采用匿名内部类的方式
在我们引入Lambda表达式就变成了
interface IMessage{
void test();
}
public class test{
public static void main(String[] args){
IMessage message = () -> System.out.println("测试");
message.test();
}
}
在这里我们使用函数式思维去思考这样做的意义
(参数) -> {
//函数语句
}
采用这个思维 我们现在定制一个函数 采用函数式的方法
interface IMymath{
int add(int x,int y); //定义函数
}
public class test{
public static void main(String[] args){
IMymath msg = (x1,x2) -> x1+x2;
int y = msg.add(1,2);
System.out.println(y);
}
}
4)方法的引用
方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。
实质上方法的引用还是 Lambda表达式 使用的操作符::
简单的说方法的引用就是简化版的Lambda表达式,区别就是这个表达式的函数题部分我们使用的是已知的方法。
- 引用静态方法
interface IMymath<P,R>{
R function(P p); //定义函数
}
public class test{
public static void main(String[] args){
IMymath<Integer,String> msg = String::valueOf;
String y = msg.function(100);
System.out.println(y);
}
}
- 引用对象方法
interface IMymath<R>{
R function(); //定义函数
}
public class test{
public static void main(String[] args){
IMymath<tring> msg = "hello"::toUpperCase;
String y = msg.function();
System.out.println(y);
}
}
- 引用普通方法
interface IMymath<R,P>{
R function(P p1,P p2); //定义函数
}
public class test{
public static void main(String[] args){
IMymath<String> msg = String::compareTo;
String y = msg.function("无敌","辉");
System.out.println(y);
}
}
- 引用构造方法
interface IMymath<R,P1,P2>{
R function(P1 p1,P2 p2); //定义函数
}
public class test{
public static void main(String[] args){
IMymath<Person,String,Integer> msg = Person::new;
String y = msg.function("无敌",12);
System.out.println(y);
}
}
5)内建函数式接口
Java1.8将生活中遇到的所有方法引用进行高度抽象就产生了4种 函数类型
1.功能型接口(Function):public interface Function<T,R>{public R apply(T t);}
Function<Integer,String> fun = String::valueOf;
System.out.println(fun.apply(100));
2.消费型接口(Consumer):public interface Consumer{public void accept(T t);}
Consumer<String> cons = Sustem.out::println;
cons.accept("无敌");
3.供给型接口(Supplier):public interface Supplier{public T get()}
Supplier<String> sup = "hello"::toUpperCase;
System.out.println(sup.get());
4.断言型接口(Predicate):public interface Predicate{public boolean test(T t);}
Predicate<String> pre = "*&%$%$1221"::startWith;
System.out.println(pre.test("22"));
生命不息!!!奋斗不止!!!