lambda表达式(>Java7)
意义
把一块代码赋值给变量,就像js中将函数赋值给一个变量。此处的代码块即为闭包,也是一个匿名内部类,可以用Runnable来实现
表现
引入了一个新的语法元素和操作符,“->”,用它连接参数与方法体。
优势
- 代码简洁
- 无需考虑匿名内部类声明中的变量、方法名,会自动匹配
- 结合使用“::”(method reference,即方法引用)、Stream API、Optional <T>可以发挥更大作用
语法格式
- 无参数,无返回值
()->println("");
- 有一个参数,且无返回值
(param)->println("");
- 只有一个参数,小括号可省略
param->println(param);
- 有两个以上参数,有返回值,且lambda方法体中有多条语句
(x, y)->{ println(""); return x+y; }
- lambda方法体中只有一条语句,return和大括号都可以省略
(x, y) -> println(x+""+y);
- lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器会根据上下文推断出相应的数据类型,即“类型推断”
注解
定义
为Java代码提供元数据。作为元数据,注解不直接影响其中的代码执行,但也有一些类型的注解晒机上可以用于这一目的。从Java5开会加入。
注解即标签,注解给代码块贴上标签以备后续处理
自定义注解
通过@Interface关键字定义,如:public @Interface Test{}
,它的形式与接口很类似,只多了一个@符号,就创建了一个名为Test的注解。
使用即是在代码块上方加上“@Test”,就应用了该注解
@Test
public class TestAnnotation{}
元注解
可以理解为注解的注解,作为基本注解能应用到其他注解上,作用是作为其他注解的解释或者区别属性。
共五种,@Rentation、@Documented、@Target、@Inherited、@Repeatable(Java8新增)
Retation,注解存活时间,详见RetentionPolicy
- SOURCE,默认,源码阶段
- CLASS,编译进行,不会加到JVM中
- RUNTIME,运行时
Target,注解的使用场景
是在方法、类还是方法参数,详见ElementType
Documented
可将注解中的元素包含到JavaDoc中
Inherited意为继承
但不是注解本身可继承,而是若被注解的类的子类没有应用任何注解时,则子类汇集成父类已经应用的带有@Inherited注解的注解
Repeatable可重复的
用处
1.提供信息给编译器:它利用注解探测错误和警告信息
2 class编一阶段时的处理:软件工具可以用来生成代码,Html文档或做其他处理
- 运行时的处理:可以在程序运行时接收代码的提取,注解不是代码本身的一部分
注解的提取
- 反射法
<1>首先通过Class对象的isAnnotationPresent()方法判断是否应用了某注解
<2>然后通过getAnnotation()方法来获取Annotation对象
或使用getAnnotations()方法 - APT(Annotation Processing Tool)
是一种处理注解的工具,它对源代码文件进行检测,找出其中的Annotation,根据注解自动生成代码。
annotation Processor和android-apt功能一直,是替代关系。
annotation Processor是APT的一种,在内置框架中,不需要引入。
APT的使用
- 目录结构
annotations: 注解的声明
api:主机的方法、接口
processors:注解扫描 - 自仿ButterKnife
注解小结
- Annotation型定义为@Interface,所有Annotation会自动继承Java.lang.Annotation这一接口,因此不能再去继承别的类或接口
- 参数成员只能用public或默认(default)这两个访问权限修饰
- 参数成员只能用基本类型(八种)和String、Enum、Class、annotations数据类型和他们的数组
- 获取类方法和字段的注解信息,必须通过Java的反射技术获取Annotation对象
网友评论