Java-Stream API、自定义注解

Stream API

  • Stream是一组用来处理数组、集合的API

  • Java 8之所以费这么大功夫引入函数式编程的原因:
    – 代码简洁函数式编程写出的代码简洁且意图明确,使用 stream接口从此告别 for 循环。
    – 多核友好,Java函数式编程使得编写并行程序从未如此简单,需要的全部就是调用一下parallel()方法。

  • Stream特性
    1:不是数据结构,没有内部存储
    2:不支持索引访问
    3:延迟计算
    4:支持并行
    5:很容易生成数组或集合(List,Set)
    6:支持过滤,查找,转换,汇总,聚合等操作

  • Stream运行机制
    Stream分为 源source,中间操作,终止操作。
    流的源可以是一个数组、一个集合、一个生成器方法,一个I/O通道等等。
    一个流可以有零个和或者多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用。一个流只会有一个终止操作。
    Stream只有遇到终止操作,它的源才开始执行遍历操作。

  • Stream的创建
    1、通过数组
    2、通过集合
    3、通过Stream.generate方法
    4、通过Stream.iterate方法
    5、其他API创建

  • Stream常用API

    • 中间操作
      过滤 filter
      去重 distinct
      排序 sorted
      截取 limit、skip
      转换 map/flatMap
      其他 peek
    • 终止操作
      循环 forEach
      计算 min、max、count、 average
      匹配 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny
      汇聚 reduce
      收集器 toArray collect

自定义注解

  • 注解
    Annontation 是Java5开始引入的新特征,中文名称叫注解。
    它提供了一种安全的类似注释的机制,用来将任何的信息戒元数据(metadata)与程序 元素(类、方法、成员变量等)进行关联。
    为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具戒框架使用。
    Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数 及本地变量的声明语句中。
    Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用, 起到说明、配置的功能。
    注解不会也不能影响代码的实际逻辑,仅仅起到辅劣性的作用。包含在 java.lang.annotation 包中。

  • 注解的作用
    生成文档。这是最常见的,也是java 最早提供的注解。常用的有@param @return 等
    跟踪代码依赖性,实现替代配置文件功能。
    在编译时进行格式检查。如@override 放在方法前,如果你这个 方法并不是覆盖了超类方法,则编译时就能检查出。

  • 注解的原理
    反射

  • 内置注解
    @Override:定义在java.lang.Override中,此注释只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明
    @Deprecated:定义在java.lang.Deprecated中,此注释可以 修饰方法、属性、类,表示不鼓励程序员使用这样的元素,通常 是因为它很危险戒者存在更好的选择
    @SuppressWarnings:定义在java.lang.SuppressWarnings中, 用来抑制编写编译时的警告信息

  • 元注解
    元注解的做用是负责注解其他注解,java中定义了四个标准的 meta-annotation类型,他们被用来提供对其他annotation类型作说明
    这些类型和它们所支持的类在java.lang.annotation包中
    – @Target:用来描述注解的使用范围(注解可以用在什么地方)
    – @Retention:表示需要在什么级别保存该注释信息,描述注解的生命周期
    Source < Class < Runtime
    – @Document:说明该注解将被包含在javadoc中
    – @Inherited:说明子类可以继承父类中的该注解

  • 自定义注解
    使用@interfac自定义注解时,自动继承了 java.lang.annotation.Annotation接口

    • 使用规则:
      – @interface用来声明一个注解,格式:public @interface 注解名{}
      – 其中的每一个方法实际上是声明了一个配置参数
      – 方法的名称就是参数的名称
      – 返回值类型就是参数的类型(返回值叧能是基本类型,Class,String,enum)
      – 可以用default来声明参数的默认值
      – 如果叧有一个参数成员,一般参数名为value
      – 注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值

Stream API

package com.petrel.stream;

import java.util.stream.Stream;

/**
 * @author Petrel
 * @data 2020/7/2 18:14
 */

public class StreamDemo {

    //通过数组来生成
    static void gen1(){
        String[] strs = {"a","b","c","d"};
        Stream<String> strs1 = Stream.of(strs);//转换为Stream
        strs1.forEach(System.out::println);//使用Stream中的forEach方法
    }

    //通过

    public static void main(String[] args) {
        gen1();
    }
}

注解

package annotation;

/**
 * @author Petrel
 * @data 2020/7/5 9:14
 */

public class Annotation {

    /**
     *
     * @param name  需要怎么样的参数
     * @return      需要怎样的返回值
     */

    /*
        用xml和注解都可以
     */

    @Deprecated
    public void show(){
        //@Deprecated 已经过时的 代表show方法已经过时
    }

    //@SuppressWarnings("all")  忽略所有的警报信息 eclipse里面经常会有波浪线 就可以用这个
}

自定义注解

自定义注解基于元注解

package annotation;

import java.lang.annotation.*;

/**
 * @author Petrel
 * @data 2020/7/5 9:28
 */

@MyAnnotation
public class MetaAnnotation {
    public void test(){

    }
}

/*这四个是元注解 作用是负责注解其他注解,比如自定义注解
@Target({ElementType.METHOD,ElementType.TYPE}) //target用来声明当前自定义的注解适合适用于什么地方,类,方法,变量,包。。。。
@Retention(RetentionPolicy.CLASS) //retention用来表示当前注解适用于什么环境,是源码级别还是类级别还是运行时环境,一般都是运行时环境
@Documented //表示该注解是否是显示在javadoc中
@Inherited //表示当前注解是否能够被继承
*/

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
@Documented
@Inherited
//自定义注解
@interface MyAnnotation{

    //定义的方式看起来像是方法,但是实际上使用在使用注解的时候填写的参数的名称,默认的名称是value
    //自定义注解中填写的所有方法都需要在使用注解的时候,添加值,很麻烦,因此包含默认值
    String name() default "zhangsan";
    int age() default 12;
    int id() default 1;
    String[] likes() default {"a","b","c"};
}

你可能感兴趣的:(Java,笔记)