Java8新特性-并行流与串行流

并行流parallel()与串行流(顺序流) sequential()

并行流 就是把 一个内容 分成多个数据块, 并用不同的线程分别处理每个数据块的流

Optional 类

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){
 ​
     }
 ​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

射手座的程序媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值