java8学习笔记

1. Lambda 表达式

Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码

像数据一样进行传递),本质上还是一个匿名内部类。

例 :Runnable r1=()->System.out.println("hehe");

2.函数式接口

只包含一个抽象方法的接口。

Java 内置四大核心函数式接口

Consumer  消费型接口

Supplier  供给型接口

Function  函数型接口

Predicate  断定型接口

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(),

示例:


创建stream

 中间操作

      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.收集到集合中


收集1

2.规约收集


收集2

3.分组

groupingBy的第二个收集器可以是任何类型,可以其他收集器结合使用

4.分区

分区看作分组一种特殊情况

5.直接收集

收集3

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)

你可能感兴趣的:(java8学习笔记)