1. Lambda 表达式
Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码
像数据一样进行传递),本质上还是一个匿名内部类。
例 :Runnable r1=()->System.out.println("hehe");
2.函数式接口
只包含一个抽象方法的接口。
Java 内置四大核心函数式接口
Consumer<T> 消费型接口
Supplier<T> 供给型接口
Function<T, R> 函数型接口
Predicate<T> 断定型接口
3. 方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用
对象::实例方法
类::静态方法
类::实例方法
例:BinaryOperator bo1=(p1,p2)-> Math.pow(p1,p2);
BinaryOperator bo2=Math::pow;
4.stream Api
1.定义
数据渠道,用于操作数据源(集合、数组等)所生成的元素序列
集合存取数据,流计算数据
2.Stream 的操作三个步骤
创建 Stream
1.Collection 接口方法 stream() parallelStream()
2.Arrays. stream(T[] array)
3.Stream.of(T... values) Stream.iterate() Stream.generate(),
示例:
中间操作
1). 筛选与切片
filter(Predicate p) 过滤
distinct() 去重(根据equals y与hashCode方法去重)
limit(long maxSize) 截断
skip(long n) 跳过
示例:
2).映射
map(Function f) :接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap(Function f) :接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流(扁平化流)
sorted(Comparator comp) :排序
例:
总结:中间操作类似于sql中对数据进行筛选 ,排序,过滤,去重等,同时多了一个映射转换的操作。
3).终结操作
查找与匹配
allMatch(Predicate p) 检查是否匹配所有元素
anyMatch(Predicate p)检查是否至少匹配一个元素
noneMatch(Predicate p)检查是否没有匹配所有元素
findFirst()返回第一个元素
findAny()返回当前流中的任意元素
归约
reduce(BinaryOperator b)
用途:元素求和 与最大最小值等
例:
收集 统计
collect(Collector c)
1.收集到集合中
2.规约收集
3.分组
groupingBy的第二个收集器可以是任何类型,可以其他收集器结合使用
4.分区
分区看作分组一种特殊情况
5.直接收集
5.并行流
1.并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流
2.默认的线程数量就是你的处理器数量,可通过系统参数修改
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","12");
3.可以声明性地通过 parallel() 与sequential() 在并行流与顺序流之间进行切换。
4. Fork/Join运行流程
5.工作窃取
采用 “工作窃取”模式(work-stealing):
当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上.在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态.而在fork/join框架实现中,如果 某个子问题由于等待另外一个子问题的完成而无法继续运行.那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行.这种方式减少了线程 的等待时间,提高了性能.
6.optional
略
7.新时间日期 API
1,基本api
LocalDate 日期 LocalDate.of(2014, 3, 18)
LocalTime 时间 LocalTime.of(13, 45, 20)
LocalDateTime=LocalDate+LocalTime 日期+时间 LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
Instant 时间戳 (toEpochMilli() 与System.currentTimeMillis() 值相同)
Duration 时间差 Duration d1 = Duration.between(time1, time2);
Period 日期差 Period.between(LocalDate.of(2014, 3, 8), LocalDate.of(2014, 3, 18));
获取信息 get(ChronoField)
修改时间with() plus minus 方法 等
2.时间调整
使用with(TemporalAdjuster)重载方法;
TTemporalAdjusters : 该类通过静态方法提供了大量的常用 TemporalAdjuster 的实现
例:LocalDateTime.now().with(TemporalAdjusters.previous(DayOfWeek.MONDAY));
3.格式化
DateTimeFormatter
format()格式化 parse()解析
DateTimeFormatter .ofPattern() 自定义格式
例:String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
4.时区
ZoneId对象与LocalDate、LocalDateTime或者是Instant对象整合起来,构造为一个ZonedDateTime实例。
5.与原Date转换
先转换为instant ,再通过时区进行转换
date <- instant +zoneid -> localdatetime( localdate localtime 先转localdatetime)
LocalDateTime 转 instant : LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant();
Date转instant :new Date().toInstant();
instant转date:Date.from(Instant instant)
instant转LocalDateTime:LocalDateTime.ofInstant(instant, zone)