Java学习笔记19-注解与java8新特性

        什么是注解?注解是Java 1.5 引入的,注解相当 于是一种嵌入在程序中的 元数据 ,可以使用注解解析工具或编译器对其进行解析,也可以指定注解在编译期或运行期有效。

        Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和任何元数据 (metadata)的途径和 方法。Annotation是一个接口,程序可以通过反射来获取指定程序元素的Annotation对象,然后通过 Annotation对象来获取注解里面的元数据。

 1.注解的作用

  •         注释
  •         标志|标识
  •         使用注解时可以传递参数,可以在程序中通过反射操作注解,获取配置的信息在程序中使用
  •         可以存在于Class文件中
  •         大量的代替|简化配置文件的使用

 2.注解的定义

        注解通过 @interface 关键字进行定义。

//注解的创建
public @interface TestAnnotation {
}

它的形式跟接口很类似,不过前面多了一个 @ 符号。上面的代码就创建了一个名字为 TestAnnotaion 的注解。

你可以简单理解为创建了一张名字为 TestAnnotation 的标签。

 3.注解的分类

根据注解参数的个数分类

        1)、标记注解:一个没有成员定义的Annotation类型被称为标记注解。

        2)、单值注解:只有一个值

        3)、完整注解:拥有多个值

根据注解使用方法和用途分类

        1)、JDK内置系统注解

        2)、元注解

        3)、自定义注解

(3.1)内置注解(常见的几种)

  • @Override 检查重写方法 

  • @SuppressWarnings("all") 抑制警告

  • @Deprecated 表示已过时,不推荐使用

  • @FunctionalInterface 标识函数式接口

//实例代码-常见的几种内置注解
@SuppressWarnings("all")
//放在此位置抑制整个程序中所有的警告
public class Class01_Annotation {
    public static void main(String[] args) {
        List list = new ArrayList();
        List list2 = new ArrayList();
    }
    @Deprecated
    public static void test(){}
    @Override
    public String toString() {
        List list = new ArrayList();
        return super.toString();
    }
}

(3.2)元注解

        元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。可以这样理解。元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。

元注解有:

        1)@Target 用于描述注解的使用范围

//实例代码-元注解@Target的使用
//此注解只能用在方法上
@Target(ElementType.METHOD)
@interface TestMethod {}

        2)@Retention 规定注解类型的声明周期

//实例代码-元注解@Retention的使用
// 此注解可以用于注解类、接口(包括注解类型) 或enum声明
@Target(ElementType.TYPE)
//该注解运行时有效。注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理
@Retention(RetentionPolicy.RUNTIME)
@interface TestRn{
}

        3)@Documented 保留在API文档中

//实例代码-元注解@Documented的使用
//可以被例如javadoc此类的工具文档化
@Documented
@interface TestDoc{
}

        4)@Inherited 标识注解类型可以被继承

:Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解)

//实例代码-元注解@Inherited的使用
//被子类继承的注解
@Inherited
@interface TestInheri{}

(3.3)自定义注解

        使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完 成其他细节。在定义注解时,不能继承其他的注解或接口。可以通 过default来声明参数的默认值。

:在注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组

  • 1.@interface 定义注解类型
  • 2.默认实现java.lang.annotation.Annotation接口
  • 3.自定义的注解类型就不能显示的继承其他父类,实现其他接口
  • 4.如果注解类中的属性只有一个,建议名字为value,为value属性赋值可以直接赋值
  • 5.为注解类型定义属性|字段: 数据类型 数据名();
  • 6.属性的数据类型要求为: 基本数据类型 String, 枚举 , 注解类型 , 以及以上类型的数组
  • 7.属性可以通过default提供默认值
//实例代码-自定义注解
public class Class003_MyAnnotation {
    @MyAnnotation(value=111,haha=123,hehe=321)
    int apple;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
    int value() default 1;
    int haha();
    int hehe();
}

4.Java8新特性 

        (4.1)Lambda表达式

        Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体。

作用:使用Lambda 表达式可以使代码变的更加简洁紧凑

语法:(形参列表)->{操作集合};

:Lambda表达式需要函数式接口的支持

//实例代码-Lambda表达式
public class Demo002 {
    public static void main(String[] args) {
        Fly something = ()->{System.out.println("飞行");};
    }
}
    interface Fly{
    void fly();
}

        该种形式即为Lambda的写法,其中 Fly something 规定了此时使用的接口类型, () 为参数列 表, {System.out.println("飞行");} 为方法体, 非常重要的 -> 即为参数列表和方法体的分割符。

(4.2)函数式接口

        接口中有且仅有一个抽象方法的接口,称为函数式接口。

        default 修饰方法只能在接口中使用(只 能被实现了这个接口的对象调用),在接口种被default标记的方法为普通方法,可以直接写方法体。 可以使用注解 @FunctionalInterface 修饰,可以检查是否是函数式接口。

四大内置函数式接口:

        1.消费型接口 Consumer<T> void accept(T t) --> 有来无回,有参数没有返回值

        2.供给型接口 Supplier<T> T get()

        3.函数型接口 Function<T,R> R apply(T t)

        4.段言型接口 Predicate<T> boolean test(T t)

:关注的只有接口中方法的参数和返回值即可

//实例代码-四大内置函数式接口的使用
//接口作为形参,Lambda作为形参
public class Class001_FunctionalInterface {
    public static void main(String[] args) {
        testConsumer(5000, m-> System.out.println("今天在薇娅直播间为鸿星尔克消费"+m));
        testConsumer(10000, m-> System.out.println("今天在李佳琪直播间为鸿星尔克消费"+m));
        System.out.println(getNum(5,()->(int)(Math.random()*(5-1+1)+1)));;
        System.out.println(getNum(3,()->(int)(Math.random()*(15-10+1)+10)));;
        System.out.println(strHandler("   haha  ",s->s.trim()));;
        System.out.println(strHandler("   haha  ",s->s.toUpperCase()));;
        List<Employee> list = new ArrayList<Employee>();
        list.add(new Employee(1003,"zhangsan",19));
        list.add(new Employee(1002,"lisi",17));
        list.add(new Employee(1001,"wangwu",18));

        System.out.println(checkEmp(list,e->e.getAge()>=18));
    }
    //对员工集合中的员工数据按照某种规则进行过滤,返回结果
    // Predicate <T> 断言型接口
    public static List<Employee> checkEmp(List<Employee> list, Predicate<Employee> predicate){
        List<Employee> newList = new ArrayList<>();    
        for(Employee e:list){
            if(predicate.test(e)){
                newList.add(e);
            }
        }
        return newList;
    }
    //对字符串进行处理,返回结果
    // Function<T, R> 函数型接口
    public static String strHandler(String str, Function<String,String> my){
        return my.apply(str);
    }
    //产生指定个数的指定规则的随机数
    //Supplier <T> 供给型接口
    public static List<Integer> getNum(int num, Supplier<Integer> supplier){
        List<Integer> list = new ArrayList<>();
        for(int i=1;i<=num;i++){
            list.add(supplier.get());
        }
        return list;
    }
    //消费的功能
    //Consumer <T> 消费型接口作为
    public static void testConsumer(int money, Consumer<Integer> con){
        con.accept(money);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值