1.注解
概念:解释代码的代码,称为注解,也叫元代码
常用的注解
@Override:重写
@Deprecated:过时
@SupperessWarnings(“deprecation”):忽略警告
自定义注解
语法:
访问权限修饰符 @interface 注解名{
公共静态常量
注解的属性
}
注意:
- 注解的属性语法格式:
数据类型 属性名();
数据类型 属性名() default 默认值;
- 如果注解的属性没有默认值,使用注解时,必须给属性赋值
- 如果注解的属性有默认值,使用注解时,可以给该属性赋值,也可以不赋值
- 注解的属性的数据类型不能是集合
注解的使用
@注解名(属性名1=属性值1,属性名2=属性值2…)
注意:
- 可以不按照顺序赋值
- 有默认值的属性可以不赋值
- 如果注解中所有属性都有默认值或没有属性,此时可以忽略()不写;
- 如果注解中有且只有一个value属性,在使用注解时,可以忽略属性名不写
如:
@注解名(值)
2.元注解
概念:解释注解的注解
常用的元注解
@Target:
作用:限定注解的使用范围
值:
TYPE:可以在类上使用
FIELD:属性上使用
METHOD:方法上使用
PARAMETER:形参上使用
CONSTRUCTOR:构造函数
ANNOTATION_TYPE:在定义注解时使用
注意:自定义一个注解,不适用该注解时,自定义的注解可以在任何一处使用
@Retention
作用:限期器使用范围(下什么情况下使用)
值:
SOURCE:在java文件时可用
CLASS:编译为class文件时可用
RUNTIME:程序运行时可用
注意:
自定义的注解默认是java文件时可用
@Documented
作用:可以生成APIwenjiaj
@Inherited
作用:允许被继承
注意:不加时不被继承的
3.注解+反射
4.Jdk1.8新特性
函数式接口
简介:一个接口中只有一个抽象方法,该接口就是函数式接口
相关注解:
@FunctionInterface
作用:验证接口是否为函数式接口
系统提供的常见的函数式接口
接口名 分类 返回值类型 抽象方法
Consumer void accept(T t ) 消费型接口
Supperlit<T> T get() 供给型接口
Function<T R> R apply(T t) 函数型接口
Predicate<T> boolean test(T t) 断言型接口
- Lambda
简介
一种特殊的匿名内部类
优点
语法简洁
节省内存,不会产生class文件
语法
()->{}
注意:
1.创建的匿名内部类中只有一个方法
2.在Lambda表达式中可以省略形参的数据类型
3. 在Lambda表达式中当只有一个形参时可以忽略小括号不写
4. 在Lambda表达式中当代码块中只有一行代码时,可以忽略大括号不写
5.当代码块中只有一行代码,该代码是返回值时,此时如果要省略大括号,也需将return去掉
6.方法引用
6.1简介
在Lambda表达式前提下一些特殊情况可以继续简化
常见形式
对象:实例方法
类:静态方法
类:实例方法
类:new `
7.流
7.1简介
Stream:工作流
类似于集合,区别是集合中存储数据,流中存储过程
7.2特点
自己不会存储数据
不会改变源对象
7.3使用步骤
- 创建
- 中间操作
注意:中间键可以有多个
- 终止操作
注意:一旦进行终止操作,该流就不能在使用了
7.4创建
方式1:
通过Collection的Stream方法获取
通过Collection对象的parallelStream方法获取
方式2:
通过Arrays提供的stream方法
方式3:
通过Stream接口提供的of,iterate,generate
方式4:
通过Stream接口子类或子类接口对象调用of,iterate,genarate
7.5中间操作
Filter:过滤
list.stream()
.filter(e->e.getMoney()>15000)
.forEach(System.out::println);
Limit:分页(限制)
list.stream()
.limit(2)
.forEach(System.out::println);
Skip:跳过
list.stream()
.skip(2)
.forEach(System.out::println);
Distinct:去掉重复
list.stream()
.distinct()
.forEach(System.out::println);
Sorted:排序
list.stream()
.sorted((e1,e2)->Double.compare(e1.getMoney(),e2.getMoney()))
.forEach(System.out::println);
Map映射操作
list.stream()
.map(e->e.getName())
.forEach(System.out::println);
Parallel并行流
list.stream()
.parallel()
.forEach(System.out::println);
注意:一个流可以有多个中间操作,也可以没有
7.6结束操作
Foreach遍历
list.stream().forEach(System.out::println);
Min最小值
Optional min=list.stream().min((o1,o2)->Integer.compare(o1.getMoney(), o2.getMoney()));
System.out.println(min.get());
Max最大值
Optional max=list.stream().max((e1,e2)->Integer.compare(e1.getMoney(), e2.getMoney()));
System.out.println(max.get());
Count数量
Long count=list.stream().filter(o->o.getMoney()>20000).count(); System.out.println(count);
Reduce:规约
Optional sum = list.stream() .map(e->e.getMoney())
.reduce((x,y)->x+y); System.out.println(sum.get());
Collect
注意:一个流有且只有一个结束操作
8.新时间API
简介
以前时间相关API时线程不安全的,而且在设计时就是混乱的
所以在jdk1.8时提供新的时间的API的类
提供的类有
LocalDate
LocalTime
LocalDateTime
替换Date
DateTimeFormatter
替换SimpleDateFormat
Instant
瞬时
ZoneId
时区
LocalDate
作用:本地日期
提供的方法:
Start LocalDate now();获取当前日期
Start LocalDate of();获取指定日期
LocalTime
作用:本地时间
提供的方法:
Start LocalTime now();获取当前时间
Start LocalTime of();获取指定日期
LocalDateTime
作用:本地日期时间
提供的方法:
Start LocalTime now();获取当前日期时间
Start LocalTime of();获取指定日期时间
getxxx():获取
withxxx():修改
plusxxx():增加
minus():减少
DateTimeFormatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
//将固定格式的字符串转换为对象
LocalDateTime dateTime = LocalDateTime.parse("2022年12月10日 13:14:52",formatter);
System.out.println(dateTime);
LocalDateTime dateTime2 = LocalDateTime.now();
//将时间转换为固定格式的字符串
String str = formatter.format(dateTime2);
System.out.println(str);
Instant
转换
//将Date对象的时间转换为LocalDatetime对象
Date date = new Date();
Instant instant = date.toInstant();
LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(dateTime);
//将LocalDatetime对象转换为Date对象
LocalDateTime dateTime2 = LocalDateTime.of(2000, 1, 1, 12, 0,1);
Instant instant2 = dateTime2.atZone(ZoneId.systemDefault()).toInstant();
Date date2 = Date.from(instant2);
System.out.println(date2);