java 8 新特性 Lambda stream optional 并行流与Fork/Join框架 新时间日期api

第一次发帖,大佬勿喷,若有不对之处欢迎指出,这些自己在以前学习过程中整理出来的,在工作中也非常实用,希望能帮助一些像我一样刚毕业不久的小伙伴。需要源码联系qq:1352057131
得之在俄顷,积之在平日。

Java8新特性

在这里插入图片描述
在这里插入图片描述

lambda表达式

1、Lambda表达式的基础语法

Java8中引入了一个新的操作符“->”该操作符称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分成两部分
左侧:Lambda表达式的参数列表
右侧:Lambda表达式中所需执行的功能,即Lambda体
语法格式一:无参数,无返回值
()-> System.out.println(“开始”);
注:右侧只有一条语句可以不用写{}
语法格式二:有一个参数,无返回值
(X)-> System.out.println(X);
语法格式三:若只有一个参数(小括号可以省略),无返回值
X-> System.out.println(X);
语法格式四:有多个参数(小括号可以省略),有返回值,并且Lambda体中有多条语句
Comparator com = (x,y)->{
System.out.println(“函数式接口”);
Return Integer.compare(x,y);
}
语法格式五:若Lambada体中只有一条语句,return和大括号都可以省略不写
Comparator com = (x,y)-> Integer.compare(x,y);
语法格式六:Lambada表达式参数列表的数据类型可以不写,因为JVM编译器通过上下文推断出数据类型,即“类型推断”
(Integer x, Integer y)-> Integer.compare(x,y);

2、java8 内置四大函数接口

一、Comsumer:消费型接口
void accpect(T t);

在这里插入图片描述
二、Supplier:供给型接口
T get();
例:产生指定个数的整数,放入集合中并返回
在这里插入图片描述
例:固定产生5个整数放入集合中
在这里插入图片描述在这里插入图片描述
三、Function<T,R>:函数型接口
R apply(T t);
在这里插入图片描述
四、Predicate:断言型接口
Boolean test(T t);
在这里插入图片描述

3、其他函数接口

在这里插入图片描述

方法引用与构造器引用

1、 方法的引用
若Lambda体中内容有方法已经实现了,我们可以使用方法引用(可以理解为方法引用是Lambda表达式的另外一种表现形式)
主要有三种语法格式:
 对象::实例方法名
 类::静态方法名
 类::实例方法名
注意:○1Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致
○2 若Lambda参数列表中第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以用ClassName::method
在这里插入图片描述

2、 构造器的引用
格式:ClassName::new
注意:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致
在这里插入图片描述
3、数组引用
格式:Type::new
在这里插入图片描述

Stream API

1、理解
Stream:数据渠道,用于操作数据源(集合、数组等)所生成的元素系列
注意:
 Stream自己不会存储元素
 Stream不会改变源对象。相反,他们会返回同一个持有结果的新Stream
 Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行
2、Stream的操作三个步骤
a) 创建Stream:
i. 一个数据源(如:集合、数组),获取一个流
b) 中间操作:
i. 一个中间操作链,对数据源的数据进行处理
c) 终止操作(终端操作):
i. 一个终止操作,执行中间操作链,并产生结果
在这里插入图片描述
3、 创建Stream示例

  1. 可以通过Collection系列集合提供的Stream()或ParallelStream()
    在这里插入图片描述
  2. 通过Arrays中静态方法Stream()获取数组流
    在这里插入图片描述
  3. 通过Stream类中的静态方法of()
    在这里插入图片描述
    4)迭代创建无限流
    在这里插入图片描述
    4、Stream的中间操作
    多个中间操作可以连接起来形成流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理。而在终止操作时一次性全部处理,
    1)筛选与切片
    在这里插入图片描述
    示例:
    在这里插入图片描述
    2)映射
    在这里插入图片描述
    Map示例:在这里插入图片描述
    FlatMap示例:
    在这里插入图片描述
    3)排序
    在这里插入图片描述
    Sorted示例:
    在这里插入图片描述
    Sorted(Comparator comp)示例:
    在这里插入图片描述在这里插入图片描述

4)查找与匹配在这里插入图片描述
allMatch示例:
在这里插入图片描述在这里插入图片描述
anyMatch示例:
在这里插入图片描述
NoneMatch示例:
在这里插入图片描述
findFirst示例:
在这里插入图片描述
注:Optional
5)归约
在这里插入图片描述
示例:
在这里插入图片描述在这里插入图片描述
6)收集
在这里插入图片描述
示例:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

并行流与Fork/Join框架

1)并行流与顺序流

在这里插入图片描述
示例:在这里插入图片描述
2)Fork/Join框架
Fork/Join框架:就是在必要情况下,讲一个大任务进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行join汇总
在这里插入图片描述
Fork/join框架与传统线程池的区别:采取“工作窃取”模式(work-stealing):当执行新的任务时它可以将其拆分成更小的任务执行,并将小的任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把他放在自己的队列中。相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理上,在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于一个等待状态。而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行。那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行。这种方式减少了线程的等待时间,提高了性能。

Optional类

Optional类(java.until.Optional)是一个容器类 ,代表一个值存在或不存在,原来是用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。
常用方法:
Optional.of(T t):创建一个Optional实例
Optional.empty():创建一个空的Optional实例
Optional.ofNullable(T t):若T不为null,创建一个Optional实例,否则创建空实例
isPresent():判断是否包含值
orElse(T t):如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值
map(Function f):如果有值,对其处理,并返回处理后的Optional,否则返回Optional.empty()
flatMap(Function mapper):与map类似,要求必须返回Optional

接口中的静态方法与默认方法

在这里插入图片描述在这里插入图片描述
接口默认方法的“类优先”原则
若一个接口中定义了一个默认方法,而另一个父类或接口中又定义了一个同名的方法时:
 选择父类中的方法。如果一个父类提供了具体实现,那么接口中具有相同名称和参数的默认方法会被忽略
 接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突。

-新时间日期API

LocalDate:日期(年 - 月 - 日)
LocalTime:时间(时 - 分 - 秒)
LocalDateTime:时间日期(年 - 月 - 日 - 时 - 分 - 秒)
Instant:它代表的是时间戳
Duration:计算两个时间之间的间隔
Period:计算两个日期之间的间隔
TemporalAdjuster:时间校正器
格式化时间:DateTimeFormatter
ZonedDateTime:这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
【与7的区别:java.time包中的类是不可变且线程安全的.新的时间及日期API位于java.time中】
示例:
//获取当前日期
LocalDate date = LocalDate.now();
//获取当前时间
LocalTime time = LocalTime.now();
//获取当前时间和日期
LocalDateTime dateTime = LocalDateTime.now();
//获取年
int year = dateTime.getYear();
//获取小时
int hour = dateTime.getHour();
在这里插入图片描述
//设置年月日时分秒(2121-10-29 13:13:13)
LocalDateTime newDateTime = LocalDateTime
.of(2021,10,29,13,13,13);
//默认获取UTC时区,UTC时区与北京时间有8小时偏差
Instant it = java.time.Instant.now();
//获取毫秒级时间戳
long time = it.toEpochMilli();

在这里插入图片描述在这里插入图片描述
//TemporalAdjuster:时间校正器
LocalDateTime it1 = LocalDateTime.now();//获取当前时间
//获取当月的第十天的日期
LocalDateTime it2 = it1.withDayOfMonth(10);
//获取下个周末
LocalDateTime it3 = it1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
//获取下个周五
LocalDateTime it4 = it1.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
//自定义获取下一个工作日的日期(下周一)
LocalDateTime it5 = it1.with((n) -> {
LocalDateTime it6 = (LocalDateTime) n;//日期强转
DayOfWeek dayOfWeek = it6.getDayOfWeek();//获取现在周几
if(dayOfWeek.equals(DayOfWeek.FRIDAY)) {
return it6.plusDays(3);
} else if(dayOfWeek.equals(DayOfWeek.SATURDAY)) {
return it6.plusDays(2);
}else if(dayOfWeek.equals(DayOfWeek.SUNDAY)) {
return it6.plusDays(1);
}else if(dayOfWeek.equals(DayOfWeek.THURSDAY)) {
return it6.plusDays(4);
}else if(dayOfWeek.equals(DayOfWeek.WEDNESDAY)) {
return it6.plusDays(5);
}else if(dayOfWeek.equals(DayOfWeek.TUESDAY)) {
return it6.plusDays(6);
}else {
return it6.plusDays(7);
}
});
//格式化时间:DateTimeFormatter
//获取当前时间
LocalDateTime ldt = LocalDateTime.now();
//定义日期转换格式
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(“yyyy-mm-dd hh:mm:ss”);
String endDate = dtf.format(ldt);

发布了2 篇原创文章 · 获赞 2 · 访问量 135

猜你喜欢

转载自blog.csdn.net/qq_44143428/article/details/104341997