并行流 就是把 一个内容 分成多个数据块, 并用不同的线程分别处理每个数据块的流
Optional<T> 类 是一个容器类, 代表一个值存在或不村子, 原来用null 表示一个值不存在, 现在Optional类可以更好的表达这个概念, 并且可以避免出现 空指针异常
常用方法:
Optional.of(T t) : 创建一个Optional实例
Optional.empty(): 创建一个空的Optional实例
Optional.ofNullable(T t) : 若t 不为null ,创建 Optionnal实例,否则创建空实例
isPresent() 判断是否包含值
get() 获得对象
orElse(T t) 如果调用对象包含值, 返回该值, 否则返回t
orElseGet(Supplier s) 如果调用对象包含值, 返回该值, 否则返回s获取的值
map(Function f) 如果有值对其处理, 并返回处理后的Optional, 否则返回Optional.empty()
flatMap (Function mapper) 与map类似, 要求返回值必须是 Optional
如果一个类 的对象 作为 另一个类的属性出现, 则 以前 直接 把 该类作为属性, 这样容易出现 空指针问题
学会了 Optional后 可以
pulbic class A{
}
public class B{
private A a; // 之前这样写, 会出现 空指针异常
private Optional<A> a = Optional.empty();
}
java8 中允许接口中包含 具有实现的方法, 该方法为 默认方法, 默认方法使用 default 修饰
?public interface Myfunc { ? // 默认方法, 用default 修饰,必须有方法体 ? default String getName(){ ? ? ? return "abc"; ? }; ?? ?}
接口 默认方法的 "类优先" 原则
若 一个接口中 定义了一个默认方法. 而另外一个父类或接口中又定义了一个 同名方法时, 则
选择父类中的方法, 如果一个父类提供了具体的实现, 那么接口中具有相同名称和参数的默认方法会被忽略.
接口冲突: 如果一个父接口提供一个默认方法, 而并一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否 是 默认方法) , 那么必须覆盖该方法 来解决冲突
静态方法:
?public interface Myfunc { ? // 默认方法, 用default 修饰,必须有方法体 ? default String getName(){ ? ? ? return "abc"; ? }; ?? ? ?static void test(){ ?? ? }; ?}测试类 可以使用 Myfunc.test() 调用
LocalDate LocalTime LocalDateTime 类的实例是 不可变的对象
他们 提供了简单的日期或时间, 并不包含当前的时间信息, 也不包含与时区相关的信息
这三个的用法基本相同
LocalDateTime.now() 获取当前系统的日期时间
LocalDateTime.of(年,月,日,时,分,秒) 设置时间
plusYears(n) n年后
minusMonths(n) n月前
getYear() getMonthValue() getDayOfMonth() getHour() getMinute() getSecond()
Instant: 时间戳 (以Unix 元年: 1970年1月1日00:00:00 到某个时间 之间的毫秒数)
? @Test
? ? ?public void test(){
? ? ? ? ?Instant instant = Instant.now();// 默认获取UTC 时区, 不是当前时间 ? , 差 8个小时
? ? ? ? ?System.out.println(instant);//2023-09-05T08:43:37.927313900Z
? ? ? ? ?OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));// 设置偏移量
? ? ? ? ?System.out.println(offsetDateTime);//2023-09-05T16:43:37.927313900+08:00
??
? ? ? ? ?System.out.println(instant.toEpochMilli());// 转为毫秒数 1693903547023
? ? }
??
?
Duration: 计算两个时间之间的间隔
Period: 计算两个 日期 之间的间隔
?
@Test
? ? ?public void test() throws InterruptedException {
? ? ? ? ?Instant i1 = Instant.now();
? ? ? ? ?Thread.sleep(1000);
? ? ? ? ?Instant i2 = Instant.now();
? ? ? ? ?// 获得 两个间隔的毫秒数
? ? ? ? ?System.out.println(Duration.between(i1, i2).toMillis());
??
? ? ? ? ?LocalTime time1=LocalTime.now();
? ? ? ? ?Thread.sleep(1000);
? ? ? ? ?LocalTime time2=LocalTime.now();
? ? ? ? ?System.out.println(Duration.between(time1, time2).toMillis());
? ? }
??
??
?@Test
? ? ?public void test() {
? ? ? ? LocalDate d1 = LocalDate.of(2023,9,4);
? ? ? ? LocalDate d2 = LocalDate.now();
? ? ? ? ?// 计算两个日期 相差几天
? ? ? ? ?System.out.println(Period.between(d1, d2).getDays());
? ? }
时间校正器:
TemporalAdjuster: 时间校正器,
TemporalAdjusters: 该类通过静态方法提供了大量的常用TemporalAdjuster的实现
? @Test
? ? ?public void test() {
? ? ? ? ?LocalDateTime time = LocalDateTime.now();
? ? ? ? ?// 下周日是 什么时候
? ? ? ? ?LocalDateTime with = time.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
? ? ? ? ?System.out.println(time);//2023-09-06T09:11:13.835816100
? ? ? ? ?System.out.println(with);//2023-09-10T09:11:13.835816100
??
??
? ? }
时间格式化
DateTimeFormatter: 格式化 时间/日期
format()
ofPattern()
?
@Test
? ? ?public void test() {
? ? ? ? ?LocalDateTime time = LocalDateTime.now();
? ? ? ? ?DateTimeFormatter df = DateTimeFormatter.ISO_DATE;
? ? ? ? ?System.out.println(time.format(df));//2023-09-06
??
? ? ? ? ?// 自定义格式
? ? ? ? // 自定义格式
? ? ? ? ?DateTimeFormatter df2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
? ? ? ? ?System.out.println(time.format(df2));//2023年09月06日 09:28:38
? ? ? ? ?System.out.println(df2.format(time));//2023年09月06日 09:28:38
??
? ? ? ? ?// 将 字符串按照 格式 转为 日期
? ? ? ? ?String str = time.format(df2);
? ? ? ? ?System.out.println(time.parse(str, df2));//2023-09-06T09:28:38
??
? ? }
时区
ZoneDate ZoneTime ZoneDateTime
?@Test
? ? ?public void test() {
? ? ? ? ?LocalDateTime time = LocalDateTime.now(ZoneId.of("Europe/Tallinn"));
? ? ? ? ?System.out.println(time);//2023-09-06T05:27:46.070275400
??
? ? ? ? ?LocalDateTime t1= LocalDateTime.now();
? ? ? ? ?ZonedDateTime zonedDateTime = t1.atZone(ZoneId.of("Asia/Shanghai"));
? ? ? ? ?System.out.println(zonedDateTime);//2023-09-06T10:29:34.575451100+08:00[Asia/Shanghai]
??
??
? ? }
?@Repeatable() ?
??
?类型注解: ?ElementType.TYPE_PARAMETER ?
? ? ?
?@Target({TYPE, FIELD, METHOD, PARAMETER, TYPE_PARAMETER})
?@Retention(RetentionPolicy.RUNTIME)
?public @interface MyAnno {
? ? ?String value() default "tj";
?}
?//测试类
? public void show(@MyAnno("abc")String name){
??
? ? }
??